2

我正在嘗試設置UICollectionView。起初我使用的是基本的UICollectionViewCell,它運行良好,細胞正在顯示。自定義UICollectionViewCell錯誤

然後我創建了我自己的collectionViewCell(子類UICollectionViewCell),以便能夠在單元格中顯示圖像。 我將故事板中的自定義單元格與標識符鏈接起來,並且還爲其指定了正確的類。

不過,我一直有這個錯誤,我不明白爲什麼:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier MediaCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

我設法通過增加在viewDidLoad這條線照顧的bug,但在教程我是繼夥計們沒有使用它:

[self.collectionView registerClass:[MediaCollectionViewCell class] forCellWithReuseIdentifier:@"MediaCell"]; 

問題是,如果我添加它,collectionView保持黑色,並沒有數據顯示。

回答

1

它實際上與所述TabBarController相關的問題。我沒有在裏面顯示正確的類,這就是爲什麼collectionView總是空的原因。 我在這裏發佈的代碼正在工作。感謝大家的幫助。

2

你說得對使用行

[self.collectionView registerClass:[MediaCollectionViewCell class] forCellWithReuseIdentifier:@"MediaCell"]; 

,因爲這有助於與小區重用。

問題可能是您的cellForRowAtIndexPath方法或您的子類,或您設置代表的方式。你能發佈代碼嗎?

你的委託方法應該是這個樣子:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    MediaCollectionViewCell* cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"MediaCell" forIndexPath:indexPath]; 
    // set cell.image 
    return cell; 
} 

您應該建立您的代理在您的viewDidLoad方法與...

[self.collectionView setDataSource:self]; 
[self.collectionView setDelegate:self]; 

編輯: 你能張貼代碼你的MediaCollectionViewCell實現?我做了類似的事情,而且我看起來像這樣。

- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self) { 
    // Initialization code 
    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 
    [self.contentView addSubview:self.imageView]; 
} 
return self; 

}

+0

我在故事板中設置了委託和數據源。下面是''cellForItemAtIndexPath'代碼 - (UICollectionViewCell *)的CollectionView:(UICollectionView *)CV cellForItemAtIndexPath:(NSIndexPath *)indexPath { MediaCollectionViewCell *細胞= [CV dequeueReusableCellWithReuseIdentifier:@ 「MediaCell」 forIndexPath:indexPath];我們可以使用下面的代碼來創建一個新的URL:[url = http://www.microsoft.com/downloads/details.asp?url=/library/default.aspx] [[cell imageView] setImage:[UIImage imageNamed:@「Default.png」]]; return cell; }' – Sinan

+0

自定義小區的代碼:'#進口 @interface MediaCollectionViewCell:UICollectionViewCell @屬性(非原子,強)IBOutlet中的UIImageView * ImageView的; @ end'謝謝! – Sinan

+0

獲取NSURL * imageURL後,你在哪裏使用它?看起來你只是將單元格設置爲Default.png,然後返回單元格。你是否以任何方式使用imageURL?您需要從imageURL下載UIImage,然後將其設置爲單元格imageView的圖像。 –

6

昨天我這個確切的問題(如文檔說,你必須註冊類),但文檔是不準確的,如果在你的故事板中存在一個原型細胞,你不應該註冊你給它一個標識符。

如果您在故事板中創建了UICollectionViewCell的原型並分配了您的自定義單元類,則無需註冊自定義UICollectionViewCell(如果您這樣做是有害的)。這是造成UICollectionView爲黑色的原因。

基於該錯誤消息,在故事板中的原型電池不具有其標識符正確設置(未設置在全部或不MediaCell

+0

我在故事板中分配了自定義單元類,並將其命名爲MediaCell。奇怪的是,故事板中的原型單元格確實具有標識符集,這就是爲什麼我不理解錯誤。謝謝! – Sinan

+0

非常感謝你爲此而犧牲了2個小時,試圖找出它爲什麼沒有拿起我的原型。 – inorganik