6

我真的,真的想为我的 UICollectionView 提供“静态”单元格,就像 UITableView 的过去一样。但我知道,我们优秀的男孩和女孩必须将dequeueReusableCellWithReuseIdentifier:forIndexPath:其用作我们细胞的工厂。因此,我提出了以下方案,并要求对其潜力进行反馈。到目前为止,它对我有用,但我害怕一个未知的陷阱。

#import "MyCellClass.h"

@implementation MyViewController {
   MyCellClass *_cell0; // etc - many are possible. could store in array
}

-(void)viewDidLoad {
   // assume MyCellClass has a +nib and +reuseId. The reader understands.
   [_collectionView registerNib:[MyCellClass nib] forCellWithReuseIdentifier:[MyCellClass reuseId]];
}

-(void)viewDidAppear:animated {
   // this is where the fun begins. assume proper counts coming from the datasource
   NSIndexPath *indexPath = [NSIndexPath indexPathWithRow:0 inSection:0];
   _cell0 = [[self collectionView] dequeueReusableCellWithReuseIdentifier:[MyCellClass reuseId] forIndexPath:indexPath];
   // etc
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
   if ([indexPath row] == 0) return _cell0;
   // etc
}

我故意掩盖了诸如配置单元格之类的细节。疯狂?天才?只是现状?到目前为止它似乎工作,但我担心,不知何故,Apple 期望dequeue从内部调用cellForPath。有什么想法吗?

4

3 回答 3

4

调用的唯一原因dequeueReusableCellWithReuseIdentifier:forIndexPath:是重用单元格。但是“静态”集合视图?我们在谈论多少个细胞?如果我有一个足够小的集合视图,它从不滚动,我会考虑根本不费心重用单元格。肯定会巧妙地解决问题。毕竟,故事板中的静态表格并没有重用单元格。这就是使它成为静态的原因。所以我会说,dequeueReusableCellWithReuseIdentifier:forIndexPath完全放弃这些东西,当被问到时只提供细胞。

没有什么神奇的dequeue;这只是一种找出重用堆中是否有任何单元格的方法,如果有,则获取一个。毕竟,考虑一下表格视图在 iOS 4 中是如何工作的。你说过dequeue,但是如果没有可重复使用的单元格来回馈,表格就会返回nil,而你必须alloc-init自己的单元格或将其从笔尖中拉出来,你自己。好吧,您建议对集合视图中的所有项目执行此操作。继续前进。

于 2013-04-11T01:35:35.583 回答
4

Apple TSI Guy 的回应:

尽管您说您的应用程序有效,但您确实应该在数据源方法“cellForItemAtIndexPath”中使用“dequeueReusableCellWithReuseIdentifier”。那是支持的使用模式。不要试图抓住你的 MyCellClass,让集合视图管理它,它会在必要时要求你将它出列。

我会噘嘴,更改我的代码,然后发出增强请求。但我告诉你它工作得很好!

于 2013-04-11T18:21:11.050 回答
0

查看我的MBStaticCollectionView,它使您能够从 Interface Builder 定义静态 UICollectionView 单元格,而无需定义数据源。

于 2015-08-19T04:14:25.177 回答