我是否需要从数据源的cellForPath中调用UICollectionView的dequeueCell:?

时间:2013-04-11 01:19:55

标签: ios uicollectionview

我真的,真的想要为我的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。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

来自Apple TSI Guy的回复:

  

虽然您说您的应用有效,但您确实应该使用   数据源中的“dequeueReusableCellWithReuseIdentifier”   方法“cellForItemAtIndexPath”。这是受支持的使用模式。   不要试图抓住你的MyCellClass,让集合视图管理   如果有必要,它会要求你出列。

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

答案 1 :(得分:3)

调用dequeueReusableCellWithReuseIdentifier:forIndexPath:的唯一原因是重用单元格。但是一个“静态”集合视图?我们在谈论多少个细胞?如果我有一个小的集合视图,它永远不会滚动,我会考虑根本不需要重复使用单元格。 肯定会彻底解决问题。毕竟,故事板中的静态表不会重复使用单元格;这就是它静止的原因。所以我会说,完全放弃关于dequeueReusableCellWithReuseIdentifier:forIndexPath的东西,并在被问到时提供单元格。

dequeue没有什么神奇之处;它只是一种方法,可以找出重用堆中是否有任何单元格,如果有的话,可以找到一个单元格。毕竟,请考虑表格视图在iOS 4中的工作原理。您说dequeue,但如果没有可重复使用的单元格可以返回,则表格返回nil,您必须alloc-init你自己的单元格或从笔尖拉出来,你自己。好吧,您建议为集合视图中的所有项目执行此操作。马上走吧。

答案 2 :(得分:0)

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