7985


`xib`で`TableViewCell`を作成し、その`TableViewCell`の内に`CollectionView`を置きました。次にその`CollectionView`の中に`CollectionViewCell`を置こうとするのですが、なぜかセルを置くことができません。`Storyboard`の`UIViewController`に`CollectionView`を置いて`CollectionViewCell`を置くと、ちゃんと置くことができます。また、`Storyboard`では`CollectionView`を置くと`CollectionView`の背景が真っ黒な状態で追加されるのですが、`xib`で`CollectionView`を置くと、初めからセルが網目のように追加された状態で置かれます。ということは`xib`では`CollectionView`の中に`CollectionViewCell`を置くことができないのでしょうか？`CollectionViewCell`が置けないので、`Storyboard`上でセルの`identifier`が設定できず少し困っています。

---追記---

ViewController.m

[code]

    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        UINib *nib = [UINib nibWithNibName:NSStringFromClass([CustomCell class]) bundle:nil];
        [self.tableView registerNib:nib forCellReuseIdentifier:@"cell"];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 1;
    }
    
    -(UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
        return cell;
    }
    
    @end
    
[/code]

CustomCell.m

[code]

    @implementation CustomCell
    
    - (void)awakeFromNib {
        [super awakeFromNib];
    
        _collectionView.delegate = self;
        _collectionView.dataSource = self;
        [_collectionView registerClass:[CustomCell class] forCellWithReuseIdentifier:@"collectionCell"];
    }
    
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
    {
        return 1;
    }
    
    -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
        return 3;
    }
    
    -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionCell" forIndexPath:indexPath];
    
        return cell;
    }
    
[/code]


CC BY-SA 3.0
2015-03-16T02:28:24.457
7952
2015-03-16T13:49:44.487
2015-03-16T06:13:13.707
5210
5210
question
objective-c storyboard xib uicollectionview
TableViewCell内にCollectionViewを置く


InterfaceBuilderのXIBファイルを作成してのプログラムを試みてみましたが、煩雑すぎて断念しました。感覚的には、すべてプログラムコードを書いて作成したのち、XIBに置き換え可能な箇所を置き換えるといったもの。Storyboardを使った場合の、どうしてもプログラムコードを書かないとダメな箇所だけコードを書くという感覚とはかなり異なります。

以下は、Storyboardを使って、テーブルビューのセルに、コレクションビューを貼り付けたサンプルプログラムのコードです。

ViewController.h ————

[code]

    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource>
    // UITableViewとUICollectionViewそれぞれの、DelegateとDataSourceプロトコルを宣言。    
    
    @end
    
[/code]

ViewController.m ————

[code]

    #import "ViewController.h"
    
    @interface ViewController ()
    // テーブルのための配列データ
    @property (nonatomic) NSArray *rowArray;
    // コレクションのための配列データ
    @property (nonatomic) NSArray *imageArray;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.rowArray = @[@"Collection", @"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"];
        self.imageArray = @[[UIImage imageNamed: @"a.png"], [UIImage imageNamed: @"b.png"], [UIImage imageNamed: @"c.png"], [UIImage imageNamed: @"d.png"], [UIImage imageNamed: @"e.png"], [UIImage imageNamed: @"f.png"], [UIImage imageNamed: @"g.png"]];
    }
    
    #pragma mark- Table View Delegate and DataSource
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.rowArray.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        // 1行目のセルのIdentifierは「Collection」、2行目以降は「Week」。
        NSString *cellIdentifier = (indexPath.row == 0) ? @"Collection" : @"Week";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier forIndexPath:indexPath];
        if (indexPath.row > 0) {
            cell.textLabel.text = self.rowArray[indexPath.row];
        }
    
        return cell;
    }
    
    #pragma mark- Collection View Delegate and DataSource
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        return self.imageArray.count;
    }
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        // セルのIdentifierは「Image」。
        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier: @"Image" forIndexPath: indexPath];
        UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag: 1];
        imageView.image = self.imageArray[indexPath.row];
    
        return cell;
    }
    
    @end
    
[/code]

サンプルの画像：

![画像の説明をここに入力](https://i.stack.imgur.com/iTRRb.png)


CC BY-SA 3.0
2015-03-16T13:49:44.487
7985
2015-03-16T13:49:44.487
7362
7952
answer