我以編程方式向控制器添加了UICollectionView,但無論如何設置,在調用dequeueReusableCellWithReuseIdentifier時無法獲得有效的UICollectionViewCell。顯示代碼,一些信息可能會有所幫助之前:派生的UICollectionViewCell總是從dequeueReusableCellWithReuseIdentifier返回空值
- 我使用的是最新的XCode
- 我我不使用故事板 iPad上中定位iOS 8.1
- 我有一個導航控制器設置,我還使用核心數據
下面的代碼:
或者Controller.h
@interface ViewController : UIViewController<UIImagePickerControllerDelegate, UICollectionViewDelegate, UICollectionViewDataSource>
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@end
Controller.m或者
@interface ViewController()
@property (strong, nonatomic) NSMutableArray *images;
@property (strong, nonatomic) UICollectionView *collectionView;
@end
// called by a button in the navigation bar
- (void)addMedia:(id)sender {
// load test images
if ([self.images count] == 0) {
NSBundle *myBundle = [NSBundle mainBundle];
NSArray *imagesPaths = [myBundle pathsForResourcesOfType:@"png" inDirectory:nil];
for (NSString *path in imagesPaths) {
UIImage *newImage = [[UIImage alloc] initWithContentsOfFile:path];
[self.images addObject:newImage];
}
self.introLabel.hidden = YES;
CGRect rect = CGRectMake(self.view.frame.size.width/2 - 250,
self.view.frame.size.height/2 - 250, 500, 500);
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(120, 120);
layout.minimumInteritemSpacing = 10;
self.collectionView = [[UICollectionView alloc] initWithFrame:rect collectionViewLayout:layout];
UINib *cellNib = [UINib nibWithNibName:@"ImageViewCell" bundle:nil];
[self. collectionView registerNib:cellNib forCellWithReuseIdentifier:@"imageCell"];
//[self.collectionView registerClass:[ImageViewCell class] forCellWithReuseIdentifier:@"imageCell"];
[self.collectionView setDelegate:self];
[self.collectionView setDataSource:self];
[self.view addSubview:self.collectionView];
}
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [self.images count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
// THIS IS ALWAYS NULL
ImageViewCell *cell = (ImageViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"imageCell" forIndexPath:indexPath];
cell.image.image = [self.images objectAtIndex:indexPath.row];
return cell;
}
ImageViewCell.h
@interface ImageViewCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UIImageView *image;
@end
ImageViewCell.m
@implementation ImageViewCell
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
// THIS IS ALWAYS NULL!
return self;
}
@end
在ImageViewCell.xib我有一個UICollectionCellView作爲馬在視圖中,其中包含我試圖填充的UIImageView; UICollectionCellView指向ImageViewCell(派生類)。
我應該提到,我嘗試了與一個單一控制器的新項目相同的方法,並以編程方式添加UICollectionView,它的工作原理,所以我必須缺少一些愚蠢或做一些稍微不同的東西,但我不知道它。
[編輯]:用解決方案更改了代碼。
我不知道這是否是你的問題,但如果你在xib中創建單元格,你應該註冊nib而不是類。你的應用崩潰了嗎?如果是這樣,你會得到什麼錯誤? – rdelmar 2014-11-24 00:49:16
'dequeueReusable ...'只在你註冊它的筆尖時自動創建一個單元格。 – 2014-11-24 01:21:16