我创建了一个看起来像这样的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,我已经把它连接起来了,但我仍然收到同样的错误。从下面的评论和答案中,这是我认为必须要解决的问题。
答案 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)
根据UICollectionView Class Reference,
CollectionViewCell
只是没有imageView
财产。您应该首先将它添加到故事板/代码中的单元格contentView
。
此外,您正在使用自己的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;
}