我是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
通过任何方式创建。
有没有人有任何想法?
答案 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;
}
答案 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对象时遇到了这个问题。