我以编程方式设置了一个集合视图:
我有两个合成的属性:
@property (strong) IconCollectionViewController *collectionViewController;
@property (strong) UICollectionView *collectionView;
以后:
// Create a layout for the collection view
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
// Create the collection view
self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"IconCell"];
// Create a collection view controller, and link it with the collection view
self.collectionViewController = [[IconCollectionViewController alloc] initWithCollectionViewLayout:flowLayout];
self.collectionView.delegate = self.collectionViewController;
self.collectionView.dataSource = self.collectionViewController;
self.collectionViewController.collectionView = self.collectionView;
此外,集合视图控制器实现了所需的协议:
@interface IconCollectionViewController () <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
如果我将集合视图作为子视图呈现,一切运作良好:
[self.view addSubview:collectionView];
但我不能使用新设置的集合视图控制器来呈现它:
[self presentViewController:self.collectionViewController animated:YES completion:nil];
在这种情况下,我收到错误消息
*** Assertion failure in -[UICollectionView
_dequeueReusableViewOfKind:withIdentifier:forIndexPath:],
/SourceCache/UIKit_Sim/UIKit-2380.17/UICollectionView.m:2249
当我尝试将单元格出列时,在数据源回调中
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"IconCell" forIndexPath:indexPath];
return cell;
}
有人可以解释为什么将集合视图作为子视图工作,并且当单元格应该出列时使用集合视图控制器呈现它会失败吗?谢谢你的帮助。
答案 0 :(得分:0)
我解决了我的问题,但我对它不满意
首先,我简化了我的代码。当我设置集合视图控制器时,我现在只创建布局和控制器,然后呈现它。这可以根据docs,“如果以编程方式创建集合视图控制器,它会自动创建一个新的未配置集合视图对象,您可以使用collectionView属性访问该对象。”<登记/>
我假设我可以在此控制器的collectionView
方法中访问集合视图控制器的viewDidLoad
属性,但事实并非如此。显然,我第一次访问它是在数据源回调collectionView:numberOfItemsInSection:
中,它给了我实际使用的collectionView
对象。因此,我只能使用
collectionViewCell
类
[view registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:myCellID];
如果这样做,一切正常 但我确信这不是注册单元类的正确方法,但我不知道在哪里做到这一点只有一次。
答案 1 :(得分:0)
我也有同样的问题,尽管这个问题可能已经很老了,但是您可以在展示它之前通过从第一个视图控制器注册单元格来展示CollectionViewController。