ストーリーボードでOK、3つのセルでUICollectionViewを作成しました。そのためにカスタムクラスを作成したセルの1つは、明らかにUICollectionViewCellを拡張します。
そして、ViewDiDApearにクラスを登録しました。
[self.collectionView registerClass:[DeviceImageCell class] forCellWithReuseIdentifier:@"Cell1"];
また、その特定のセルにimageViewを追加し、カスタムクラスでそのimageViewのアウトレットを追加しました。カスタムセルを作成すると、ストーリーボードに設定されているすべてのもの、つまり背景色、画像ビューの場所などがすべて失われるという問題が発生します。このため、私のimageViewは常にnilを返します。
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 0)
{
static NSString *identifier = @"Cell1";
DeviceImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
UIImage *image = [UIImage imageNamed:@"dysart-woods-full.jpg"];
cell.imageview.image = image;
cell.backgroundColor = [UIColor blueColor];
//cell.imageview.image = image;
return cell;
}
else if(indexPath.row == 1)
{
static NSString *identifier = @"Cell2";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
return cell;
}
else
{
static NSString *identifier = @"Cell3";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
UIImageView *imageView = (UIImageView *)[cell viewWithTag:1];
imageView.image = [UIImage imageNamed:@"dysart-woods-full.jpg"];
return cell;
}
}
あなたはおそらく長い間この問題を解決してきました。
しかし、これを見つけて同じ問題を抱えている人のために
それはあなたのregisterClass
でのviewDidAppear
呼び出しです
[self.collectionView registerClass:[DeviceImageCell class] forCellWithReuseIdentifier:@"Cell1"];
すでにInterfaceBuilderにクラスを登録しているので、registerClass:forCellWithReuseIdentifier:
の呼び出しは、IBによって作成されたエントリを置き換えます。
この行を削除すると、問題が修正されます。
このようなセルを使用している場合は、カスタムセルのnib
を登録する必要があります-
したがって、次のようになります。
[self.collectionView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellWithReuseIdentifier:@"CustomCellIdentifier"];
の代わりに:
[self.collectionView registerClass:[CustomCell class] forCellWithReuseIdentifier:@"CustomCellIdentifier"];
まあ、これは奇妙です。私は解決策を知っていますが、なぜそれが違いを生むのかよくわかりません。私は同じ正確なセットアップと同じ問題を抱えていました。 UIImageViewではIBOutletがnilに設定されていましたが、UILabelsでは設定されていませんでした。
UIImageViewの宣言を、インスタンス変数ではなく強力なプロパティに変更します。
@property (strong) IBOutlet UIImageView* imageView;
これで問題は解決しました。明らかに、UIImageViewがストーリーボードから接続/インスタンス化される方法には何かがあります。追加された「奇妙な」要因として、私はUITableViewCellでivarの同じセットアップを使用し、UICollectionViewCellでのみ問題はありません。
同様の問題が発生しましたが、DeviceImageCell
に次のコードを追加することで解決しました。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_imageview = [[UIImageView alloc] initWithFrame:self.contentView.bounds];
[self.contentView addSubview:_imageview];
}
return self;
}
残念ながら、このコードを追加せずに_imageviewを初期化することはできませんでした。
これもチェックして、
したがって、ストーリーボードでカスタムCollectionViewセルを宣言するときは、[コレクションの再利用可能なビュー]の下にある「識別子」という名前の属性を文字列に指定する必要があります。これは奇妙に聞こえるかもしれませんが、識別子の名前がコレクションビューセルのクラス名と同じでないかどうかを確認してください。 セルのクラス/ファイル名とセル識別子は異なっている必要があります。
それは私にとって本当にうまくいったので、投稿しました。