UICollectionViewCell无法识别的选择器发送到实例

时间:2014-03-25 08:14:41

标签: ios objective-c uicollectionview uicollectionviewcell

我创建了一个看起来像这样的UICollectionViewCell

#import "PhotoCell.h"


@implementation PhotoCell

@synthesize imageView;

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.backgroundColor = [UIColor clearColor];

        imageView = [[UIImageView alloc] initWithFrame:(CGRect){.origin = CGPointMake(4.0f, 4.0f), .size=CGRectInset(frame, 4.0f, 4.0f).size}];
        imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [self.contentView addSubview:imageView];
    }
    return self;
}

@end

我从我的一个视图控制器调用它,我正在尝试设置一个UICollectionView ..这是我调用这个类的地方

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
    PhotoCell *cell = (PhotoCell *)[self.photoCollectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    NSDictionary *currentPhotoDict = [imageArray objectAtIndex:indexPath.row];
    UIImage *imageForCollection = [UIImage imageWithData:[currentPhotoDict objectForKey:@"DImage"]];

    // but I have no idea where to pass the imag....

    cell.imageView.image = imageForCollection;

    return cell;
}

问题是,我收到此错误,然后我的应用程序陷入堆中。

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UICollectionViewCell imageView]: unrecognized selector sent to instance 0x16dc1a90'

更新

我创建了一个.nib文件调用aPhotoCell,我从中删除了UIView并添加了一个UIImageView。然后我将对象Custom Class更改为PhotoCell,现在我可以从PhotoCell看到UIImageView的IBOutlet,我已经把它连接起来了,但我仍然收到同样的错误。从下面的评论和答案中,这是我认为必须要解决的问题。

5 个答案:

答案 0 :(得分:5)

一些事情......

PhotoCell班级中 - 申报公共财产:

 @property (weak, nonatomic) IBOutlet UIImageView *imageView;

然后在你的PhotoCell xib(我假设这是你从哪里创建它?)将它连接到你创建的IBOutLet

我认为您在cellForItemAtIndexPath中做错了 - 因为您的错误显示UICollectionViewCell的实例没有响应cell.imageView.image = imageForCollection;

确保您的单元格标识符与您在storyboard / xib文件中的标识符相同 像这样重写你的cellForItemAtIndexPath方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;{
PhotoCell *cell = [ self.photoCollectionView dequeueReusableCellWithReuseIdentifier:@"CORRECT CELL IDENTIFIER HERE" forIndexPath:indexPath];

NSDictionary *currentPhotoDict = [imageArray objectAtIndex:indexPath.row];
UIImage *imageForCollection = [UIImage imageWithData:[currentPhotoDict objectForKey:@"DImage"]];


cell.imageView.image = imageForCollection;

return cell;
}

修改

您似乎创建了UICollectionViewCell的子类,但从未为其创建xib文件。由于您没有使用故事板,请执行以下操作:

在Xcode中:

创建新文件 - 从“User Interface下方左侧选择”iOS'“,然后从显示的选项中选择"empty"

创建xib文件后 - 转到该文件并删除其中的UIView。然后从右侧的对象库中查找UICollectionView Cell并将其拖到视图上,然后拖动UIImageView并将其放入UICollectionView cell.

现在选择刚创建的UICollectionViewCell并将其类设置为PhotoCell类。像上面一样连接你的IBOutlets。 请务必同时设置“Reusable Cell”属性。这里很重要。

然后在加载viewController的{​​{1}}中,将其添加到UICollectionView

viewDidLoad

这应该对你有所帮助。

答案 1 :(得分:4)

我也有这个问题,我的问题是我的代码在另一个地方出错了。

我使用此代码在viewDidLoad方法中注册UICollectionViewCell。

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

但是,当我尝试使用自定义UICollectionViewCell更新单元格时,我没有更改此行以使用我的自定义单元格。所以我把代码更改为:

[self.collectionView registerClass:[MyCustomCell class] forCellWithReuseIdentifier:@"reuseLabel"];

答案 2 :(得分:0)

  1. 根据UICollectionView Class ReferenceCollectionViewCell只是没有imageView财产。您应该首先将它添加到故事板/代码中的单元格contentView

  2. 此外,您正在使用自己的PhotoCell课程。检查您的单元格在Storyboard中是否具有正确的类名。

答案 3 :(得分:0)

我假设由“cell”标识的单元格是在Xib文件中定义的。如果是这样,我怀疑错误是因为Xib文件中的主视图是使用UICollectionViewCell类而不是您的自定义PhotoCell类定义的。

编辑:
在得知您没有使用xib或故事板之后,会发生dequeueReusableCellWithReuseIdentifier找不到任何具有给定标识符“cell”的单元格,因为您没有在任何地方定义它。来自文档:

  

您必须使用以下命令注册类或nib文件   registerNib:forCellReuseIdentifier:或   调用此方法之前的registerClass:forCellReuseIdentifier:方法   方法

在您的情况下,您应该使用registerClass:...使用“单元格”或任何其他标识符注册您的课程。

答案 4 :(得分:0)

PhotoCell xib文件需要设置" cell"在标识符中 你的代码应该是:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
    PhotoCell *cell = (PhotoCell *)[self.photoCollectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    if (cell == nil) {
      // Load the top-level objects from the custom cell XIB.
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cell" owner:self options:nil];
    // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
    cell = [topLevelObjects objectAtIndex:0];
    }
    NSDictionary *currentPhotoDict = [imageArray objectAtIndex:indexPath.row];
    UIImage *imageForCollection = [UIImage imageWithData:[currentPhotoDict objectForKey:@"DImage"]];

    // but I have no idea where to pass the imag....

    cell.imageView.image = imageForCollection;

    return cell;

}