web-dev-qa-db-ja.com

UICollectionView cellForItemAtIndexPathがセルを登録していません

表示したいのは画像だけなので、UICollectionViewCellを使用しようとしています。 UICollectionViewCellcontentViewプロパティでUIColor colorWithImage:を使用して、セルに画像を追加できます。

loadViewメソッドでは、次のようにセルを登録しています:[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

以下は私のcellForItemAtIndexPathメソッドです:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
    // cell customization
    return cell;
}

実行すると、デキュー行に到達するとすぐに、次のエラーでクラッシュします。

*** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:]

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier MyCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

カスタムセルを設定するのが面倒で、それをクラスとして使用すると、同じエラーが発生しました。カスタムセルはUICollectionViewCellをサブクラス化し、デフォルトのinitWithFrameを除き、何も実装しませんでした。ビューの背景色を変更したかったからです。私は問題が何であるかわかりませんが、誰かが私のコードを見て助けてくれますか?私はこれをかなり長い間まったく運のない状態で把握しようとしてきました。

31
darksky

画像を表示するだけの場合、サブクラス化を行う必要はありません。セルのbackgroundColorcolorWithPatternImage:で設定できます。次のようにクラスを登録します。

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];

その後、次のように使用します。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]];
    return cell;
}

この例では、結果はarrayUIImagesです。

60
rdelmar

アプリケーションでxibを使用している場合は、viewdidLoadメソッドに以下を追加します

    [self.myCollectionView registerNib:[UINib nibWithNibName:@"CollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CellIdentifier"];

それ以外の場合、ストーリーボードを使用している場合は、次を追加します

  [self.myCollectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CellIdentifier"];

最後にこれを追加します(そうでない場合)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CellIdentifier" forIndexPath:indexPath];
 return cell;
}

上記の助けになることを願っています。

14
Gagan_iOS

ブレークポイントを設定してみてください

[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];

LoadView(viewDidLoadを意味していましたか?)メソッドが呼び出されていないため、クラスがcollectionViewに登録されないことを推測します。

8
Charlie Elliott

コレクションビューがストーリーボードに接続され、デリゲートとデータソースがそこに設定され、データソースとデリゲートに必要なメソッドを提供する場合、register呼び出しを追加すると

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath

独自のサブクラスの代わりにUICollectionViewを返します。したがって、両方ではなくいずれかを行います。

7
Zsolt

コードでセル識別子名を設定します

enter image description here

4
codercat