web-dev-qa-db-ja.com

カスタムUICollectionViewCellのUIImageViewは常にnilを返します

ストーリーボードでOK、3つのセルでUICollectionViewを作成しました。そのためにカスタムクラスを作成したセルの1つは、明らかにUICollectionViewCellを拡張します。

enter image description here

そして、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;
    }
}
23
user1001506

あなたはおそらく長い間この問題を解決してきました。

しかし、これを見つけて同じ問題を抱えている人のために

それはあなたのregisterClassでのviewDidAppear呼び出しです

[self.collectionView registerClass:[DeviceImageCell class] forCellWithReuseIdentifier:@"Cell1"];

すでにInterfaceBuilderにクラスを登録しているので、registerClass:forCellWithReuseIdentifier:の呼び出しは、IBによって作成されたエントリを置き換えます。

この行を削除すると、問題が修正されます。

49
Chad Edrupt

このようなセルを使用している場合は、カスタムセルのnibを登録する必要があります-

したがって、次のようになります。

[self.collectionView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellWithReuseIdentifier:@"CustomCellIdentifier"];

の代わりに:

[self.collectionView registerClass:[CustomCell class] forCellWithReuseIdentifier:@"CustomCellIdentifier"];
11
atulkhatri

まあ、これは奇妙です。私は解決策を知っていますが、なぜそれが違いを生むのかよくわかりません。私は同じ正確なセットアップと同じ問題を抱えていました。 UIImageViewではIBOutletがnilに設定されていましたが、UILabelsでは設定されていませんでした。

UIImageViewの宣言を、インスタンス変数ではなく強力なプロパティに変更します。

@property (strong) IBOutlet UIImageView* imageView;

これで問題は解決しました。明らかに、UIImageViewがストーリーボードから接続/インスタンス化される方法には何かがあります。追加された「奇妙な」要因として、私はUITableViewCellでivarの同じセットアップを使用し、UICollectionViewCellでのみ問題はありません。

2
MobileVet

同様の問題が発生しましたが、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を初期化することはできませんでした。

1
Dmytro

これもチェックして、

したがって、ストーリーボードでカスタムCollectionViewセルを宣言するときは、[コレクションの再利用可能なビュー]の下にある「識別子」という名前の属性を文字列に指定する必要があります。これは奇妙に聞こえるかもしれませんが、識別子の名前がコレクションビューセルのクラス名と同じでないかどうかを確認してください。 セルのクラス/ファイル名とセル識別子は異なっている必要があります。

それは私にとって本当にうまくいったので、投稿しました。

0
Vinod Supnekar