0

我以编程方式设置了一个集合视图:
我合成了 2 个属性:

@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;
}

有人可以解释为什么将集合视图呈现为子视图有效,并在单元格应该出列时使用集合视图控制器呈现它失败?谢谢你的帮助。

4

2 回答 2

0

我解决了我的问题,但我对此并不满意。
首先我简化了我的代码。当我设置集合视图控制器时,我现在只创建布局和控制器,然后呈现它。根据文档,这是可能的,“如果您以编程方式创建集合视图控制器,它会自动创建一个新的未配置集合视图对象,您可以使用 collectionView 属性访问它。
我假设我可以访问collectionView集合视图的属性控制器已经在viewDidLoad这个控制器的方法中,但事实并非如此。显然,我第一次可以访问它是在数据源回调collectionView:numberOfItemsInSection:中,它给了我实际使用的collectionView目的。因此,我只能collectionViewCell使用单元格标识符注册我的班级

[view registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:myCellID];  

如果这样做,一切正常。
但我确信这不是注册单元类的正确方法,但我不知道在哪里更早并且只有一次。

于 2013-06-26T08:32:50.637 回答
0

我有同样的问题,虽然这可能很老了,您可以通过在呈现之前从第一个视图控制器注册单元格来呈现 CollectionViewController。

于 2020-01-10T19:21:48.143 回答