自定义UICollectionViewCell中的UIImageView始终返回nil

时间:2013-10-22 16:34:36

标签: ios objective-c uicollectionviewcell

在我的故事板中确定我已经制作了一个包含3个单元格的UICollectionView。我为其制作自定义类的一个单元显然扩展了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;
    }
}

5 个答案:

答案 0 :(得分:48)

你可能早就解决了这个问题。

然而,对于那些发现此问题且具有相同问题的人

registerClass

中的viewDidAppear来电
[self.collectionView registerClass:[DeviceImageCell class] forCellWithReuseIdentifier:@"Cell1"];

您已在Interface Builder中注册该类,因此对registerClass:forCellWithReuseIdentifier:的调用将替换IB创建的条目。

删除此行将解决此问题。

答案 1 :(得分:10)

如果您使用的是自定义单元格nib,则应该注册

所以它会是:

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

而不是:

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

答案 2 :(得分:2)

嗯,这很奇怪。我知道一个解决方案,但我不太明白它为什么会有所作为。我有完全相同的设置和相同的问题。对于UIImageView,IBOutlet被设置为nil,而不是UILabels。

将UIImageView的声明更改为强属性而不是实例变量。

@property (strong) IBOutlet UIImageView* imageView;

这解决了我的问题。很明显,UIImageView与故事板连接/实例化的方式有所不同。作为一个额外的“怪异”因素,我使用与UITableViewCell相同的ivars设置并且没有问题,仅在UICollectionViewCell中

答案 3 :(得分:1)

我遇到了类似的问题,通过在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。

答案 4 :(得分:0)

同时检查一下,

现在,当您在其Storyboard中声明Custom CollectionView Cell时,您需要在Collection Reusable View下将一个名为“Identifier”的Attribute指定为某个String。  现在这可能听起来很好,但是,     检查Identifier的名称是否与Collection View Cell的类名称不同。    单元格和单元格标识符的类/文件名必须不同。

这真的对我有用,因此张贴。