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

Mur*_*gal 23 objective-c uicollectionview

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

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

  • numberOfSectionsInCollectionView:被叫,我返回1
  • collectionView:numberOfItemsInSection: 被调用,我返回模型的大小(20)
  • collectionView:layout:sizeForItemAtIndexPath: 为模型中的每个项目调用一次
  • collectionView:layout:insetForSectionAtIndex: 叫做
  • collectionView:cellForItemAtIndexPath: 被叫,它在这条线上崩溃了......

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
    
    Run Code Online (Sandbox Code Playgroud)

有这个错误......

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'UICollectionView must be initialized with a non-nil layout parameter'
Run Code Online (Sandbox Code Playgroud)

当我在该行暂停执行并检查控制台时,似乎有一个布局......

(lldb) po collectionView.collectionViewLayout
(UICollectionViewLayout *) $4 = 0x07180fd0 <UICollectionViewFlowLayout: 0x7180fd0>
Run Code Online (Sandbox Code Playgroud)

UICollectionView是故事板中唯一一个场景的一部分.在viewController.m中,没有任何其他方法可以UICollectionView创建.

有没有人有任何想法?

Maz*_*ini 31

这对我有用:

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

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


Mur*_*gal 18

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

[self.collectionView registerClass:[UICollectionView class] 
        forCellWithReuseIdentifier:@"MyCell"];
Run Code Online (Sandbox Code Playgroud)

但应该是这样的:

[self.collectionView registerClass:[UICollectionViewCell class] 
        forCellWithReuseIdentifier:@"MyCell"];
Run Code Online (Sandbox Code Playgroud)

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


jki*_*jki 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;
}
Run Code Online (Sandbox Code Playgroud)

From:UICollectionViewController类参考:概述