2012-10-08 131 views
16

我想添加一個UICollectionView到IB中的.nib文件。我已經完成了一些教程,並沒有任何問題。UICollectionView不包含UICollectionViewCell在IB

在我現有的應用程序中,當我將集合視圖拖到IB中的視圖中,然後展開該對象時,CollectionView流佈局就在那裏,但沒有集合視圖單元格。我也不能將單元拖放到集合視圖中。此外,集合視圖的顯示方式也不同,顯示的是網格單元格的圖像而不是普通的白色框。

我試着創建一個新的視圖控制器與筆尖,並添加collectionView時具有相同的結果。

此應用中定位iOS 4.2,但我已經改變了部署目標到iOS 6

在任何新建項目,我沒有得到這個行爲。

+6

OK,看來你只能佈局完全使用IB一個UICollectionView在故事板內。在.nib中,你會看到上面描述的行爲。在故事板中,您使用UICollectionView獲取UICollectionViewCell。那是怎麼回事??? – Alpinista

+0

也有這個相同的問題,相當煩人 – adit

+0

即使在故事板中,也不能將集合視圖單元淡化並拖放到集合視圖對象中。不知道爲什麼。 – theiOSguy

回答

3

在單獨的nib文件中定義您的單元格視圖。該視圖必須是UICollectionViewCell或其子類。

然後,您必須使用集合視圖註冊筆尖:

- (void)viewDidLoad 
{ 
    UINib *cellNib = [UINib nibWithNibName:@"MyNib" bundle:nil]; 
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"cell"]; 
} 
+2

由於某些原因,這是行不通的。當出隊單元時,拋出一個異常:「nib必須包含一個頂級對象,它必須是一個UICollectionReusableView實例」。這很奇怪,因爲文檔中聲明「nib文件只能包含一個頂級對象,而且該對象必須是UICollectionViewCell類型」。 – DELUXEnized

+0

UICollectionViewCell繼承自UICollectionReusableView。 –

8

我不能告訴你爲什麼它不工作,但對我來說,從這個博客帖子的子類的方法解決了這個問題:

http://www.adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial.php

這裏是一個簡短的總結:

  • 創建新類MyViewCell,它擴展了UICollectionViewCell並根據需要創建屬性,操作,插座和方法。

@interface MyViewCell : UICollectionViewCell

  • 創建集合視圖細胞作爲其根對象視圖(XIB文件)(和刪除被默認創建的對象)。
  • 在屬性中設置此Collection Collection View Cell的自定義類爲擴展類MyViewCell(而不是默認的UICollectionViewCell)。
  • 在集合可重用視圖下的屬性中定義了一個標識符,例如, myCell,稍後您將需要註冊您的電話。
  • 回到您的自定義類並修改inithWithFrame方法來加載和使用您創建的視圖。

    - (id)initWithFrame:(CGRect)frame 
    { 
        self = [super initWithFrame:frame]; 
        if (self) 
        { 
        // Initialization code 
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CVCell" owner:self options:nil]; 
    
        if ([arrayOfViews count] < 1) { return nil; } 
    
        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) { return nil; } 
    
        self = [arrayOfViews objectAtIndex:0]; 
        } 
        return self; 
    } 
    
  • ,那麼你可以註冊這個類可以使用的的CollectionView與

[self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"myCell"];

+0

雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 –

+0

我在答案中添加了更多詳細信息。 – DELUXEnized

+0

太棒了!只是不要忘記註冊collectionView: [self.collectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@「myCell」]; – atulkhatri

0

雖然這些問題的答案是正確的,問題的根本原因是相當微妙和蘋果需要更新日誌中的錯誤消息。當你看到:

Unknown class MyViewCell in Interface Builder file. 

這實際意味着是你的源代碼缺少@implementation聲明或.m文件還沒有被添加到目標。因此,檢查你的代碼,並確保您有:

@implementation MyViewCell 

@end 

這是雙方的UITableViewCell和UICollectionViewCell如此。

我在一般情況下進一步討論https://stackoverflow.com/a/12755891/539149問題。

有趣的是,如果你缺少@implementation,並呼籲:

[self.myCollectionView registerClass:[MyViewCell class] forCellWithReuseIdentifier:@"MyViewCell"]; 

您將看到:

Undefined symbols for architecture armv7: 
    "_OBJC_CLASS_$_MyViewCell", referenced from: 
     objc-class-ref in MyViewController.o 
ld: symbol(s) not found for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

所以蘋果知道這個問題,他們只是AREN」在編譯期間檢測它。我會建議不要將自定義單元格放入單獨的筆尖或調用registerClass:forCellWithReuseIdentifier :.將自定義單元存儲在其接口構建器中的UICollectionView或UITableView容器內更清潔。

8

自問題提出以來已經有一段時間了,但我最近面臨同樣的問題。

最終,我找到了答案here

簡而言之:

  • 不能拖放UICollectionViewCell成UICollectionView,如果你是在一個文件的.xib。這隻能在故事板中實現。
  • 的解決辦法是建立一個的.xib文件爲您的自定義單元格,並使用手動註冊細胞:

    [self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:CELL_ID];

+0

這仍然是Xcode 8.2.1上的一個問題。我認爲我們必須永遠使用這個解決方法。 –

+0

對於解決方法,我必須使用registerNib,否則dequeueReusableCell只是一個空視圖,沒有在xib中配置任何信息。 –

+0

仍然與w/Xcode 8.3相同。爲什麼... – Jonny

相關問題