表示したいのは画像だけなので、UICollectionViewCell
を使用しようとしています。 UICollectionViewCell
のcontentView
プロパティで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
を除き、何も実装しませんでした。ビューの背景色を変更したかったからです。私は問題が何であるかわかりませんが、誰かが私のコードを見て助けてくれますか?私はこれをかなり長い間まったく運のない状態で把握しようとしてきました。
画像を表示するだけの場合、サブクラス化を行う必要はありません。セルのbackgroundColor
をcolorWithPatternImage:
で設定できます。次のようにクラスを登録します。
[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;
}
この例では、結果はarray
のUIImages
です。
アプリケーションで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;
}
上記の助けになることを願っています。
ブレークポイントを設定してみてください
[self.collectionView registerClass:[ImageCell class] forCellWithReuseIdentifier:@"MyCell"];
LoadView(viewDidLoadを意味していましたか?)メソッドが呼び出されていないため、クラスがcollectionViewに登録されないことを推測します。
コレクションビューがストーリーボードに接続され、デリゲートとデータソースがそこに設定され、データソースとデリゲートに必要なメソッドを提供する場合、register呼び出しを追加すると
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath
独自のサブクラスの代わりにUICollectionView
を返します。したがって、両方ではなくいずれかを行います。
コードでセル識別子名を設定します