必须使用非零布局参数初始化UICollectionView

时间:2012-10-28 16:01:24

标签: objective-c uicollectionview

我是UICollectionView的新手,我正在按照我在网上找到的教程,但我遇到了一个我无法弄清楚的错误。这是一个背景。

在调试器中,我可以看到发生了以下情况:

  • numberOfSectionsInCollectionView:被叫,我返回1
  • collectionView:numberOfItemsInSection:被调用,我返回模型的大小(20)
  • collectionView:layout:sizeForItemAtIndexPath:会为模型中的每个项目调用一次
  • collectionView:layout:insetForSectionAtIndex:被称为
  • collectionView:cellForItemAtIndexPath:被调用,它在此行崩溃......

    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通过任何方式创建。

有没有人有任何想法?

6 个答案:

答案 0 :(得分:31)

这对我有用:

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

如果以编程方式创建UICollectionView,则需要布局。

答案 1 :(得分:18)

事实证明问题出在registerClass:上。我有这个:

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

但应该是这样的:

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

因此,出列方法是创建UICollectionView而不是UICollectionViewCell

答案 2 :(得分:8)

如果要在UICollectionViewController中以编程方式创建集合视图控制器,请确保 UICollectionViewController init 方法使用[super initWithCollectionViewLayout]而不是[super init],例如:

-(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 :(得分: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];

答案 4 :(得分:1)

如果您的类是从UICollectionViewController继承,或者您是以编程方式创建UICollectionView,那么在推送类时您可以设置collectionViewLayout,如下所示

let homeViewController = HomeViewContoller(collectionViewLayout:UICollectionViewLayout())

答案 5 :(得分:0)

我在初始化视图之前返回一个itemSize等于self.view.bounds的UICollectionViewLayout对象时遇到了这个问题。