23

我是新手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以任何方式创建其他 s。

有没有人有任何想法?

4

6 回答 6

32

这对我有用:

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

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

于 2012-11-04T21:48:47.637 回答
18

事实证明,问题出在registerClass:. 我有这个:

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

但应该是这样的:

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

所以 dequeue 方法是创建 aUICollectionView而不是 a UICollectionViewCell

于 2012-11-05T05:15:19.657 回答
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 类参考:Overview

于 2014-04-22T15:27:36.947 回答
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];
于 2015-01-05T07:34:02.327 回答
1

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

let homeViewController = HomeViewContoller(collectionViewLayout:UICollectionViewLayout())
于 2017-01-30T06:21:09.803 回答
0

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

于 2015-02-20T18:23:52.657 回答