2012-10-28 119 views
21

我是012,的新手,我正在關注我在網上找到的教程,但是我陷入了一個我無法弄清的錯誤。這裏有一些背景。UICollectionView必須使用非零布局參數進行初始化

在調試器中,我可以看到下面發生的事情:

  • numberOfSectionsInCollectionView:叫我返回1
  • collectionView:numberOfItemsInSection:叫我返回到模型(20)
  • collectionView:layout:sizeForItemAtIndexPath:的大小被稱爲模型中的每個項目一次
  • collectionView:layout:insetForSectionAtIndex:被稱爲
  • collectionView:cellForItemAtIndexPath: g ETS打電話,當我暫停在該行執行,並檢查它似乎有控制檯崩潰在這條線......

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    

與此錯誤...

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter' 

佈局...

(lldb) po collectionView.collectionViewLayout 
(UICollectionViewLayout *) $4 = 0x07180fd0 <UICollectionViewFlowLayout: 0x7180fd0> 

UICollectionView是在故事板的唯一場景的一部分。在viewController.m中,沒有任何方法創建其他UICollectionView

有沒有人有任何想法?

+2

這錯誤出現,當你使用分配/ init或新做一個新的集合視圖類,而不是在初始化時添加布局對象。您是否在任何地方製作新的收藏視圖? – jrturton

+1

@jrturton不是我知道的。 UICollectionView是故事板中唯一場景的一部分。在viewController.m中,沒有任何方法創建UICollectionViews。但有了這些說法,並且對收集視圖不熟悉,我不確定佈局與收集視圖關聯的位置。 –

回答

18

事實證明問題出在registerClass:。我有這樣的:

[self.collectionView registerClass:[UICollectionView class] 
     forCellWithReuseIdentifier:@"MyCell"]; 

,但它應該是這樣的:

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

所以離隊方法創建一個UICollectionView,而不是一個UICollectionViewCell

31

這爲我工作:

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init]; 
    [aFlowLayout setItemSize:CGSizeMake(200, 140)]; 
    [aFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal]; 
myCollectionViewController = [[MyCollectionViewController alloc]initWithCollectionViewLayout:flowLayout]; 

如果以編程方式創建UICollectionView需要佈局。

+1

對不起,這不是。正如我在問題中提到的,這是從故事板中提出的,並且如控制檯輸出中所示,集合視圖有一個有效的佈局。看到我的答案是什麼問題原來是。 –

+0

是的,這也是必不可少的。你有一個錯誤的班級分配給單元格。 –

8

如果您在UICollectionViewController使集合視圖控制器編程確保UICollectionViewController初始化方法使用[超級initWithCollectionViewLayout]而不是[超級初始化],例如:

-(id) initWithImages:(NSArray *)pImages { 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    [layout setMinimumInteritemSpacing:0.0f]; 
    [layout setMinimumLineSpacing:0.0f]; 
    layout.scrollDirection = UICollectionViewScrollDirectionVertical; 
    if (self = [super initWithCollectionViewLayout:layout]) { 
     _images= [[NSArray alloc] initWithArray:pImages]; 
    } 
    return self; 
} 

來源:UICollectionViewController Class Reference:Overview

3

我得到了同樣的問題,我的得到了利用

UICollectionViewFlowLayout *myLayout = [[UICollectionViewFlowLayout alloc]init]; 
[myLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
[myLayout setMinimumInteritemSpacing:0.0f]; 
[myLayout setMinimumLineSpacing:0.0f]; 
UICollectionView *myCollectionView = [[UICollectionView alloc]initWithFrame:viewfame collectionViewLayout:myLayout]; 

,而不是

UICollectionView *myCollectionView = [[UICollectionView alloc]initWithFrame:self.view.frame]; 
[myLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
[myLayout setMinimumInteritemSpacing:0.0f]; 
[myLayout setMinimumLineSpacing:0.0f]; 
[myCollectionView setCollectionViewLayout:myLayout]; 
0

返回時,我也陷入了這個問題解決了在視圖進入之前itemSize等於self.view.bounds的UICollectionViewLayout對象itialized。

0

如果你的類是繼承UICollectionViewController或您以編程方式創建UICollectionView然後同時按下你可以設置collectionViewLayout像下面

let homeViewController = HomeViewContoller(collectionViewLayout:UICollectionViewLayout()) 
相關問題