6

我有一个特别UICollectionViewCell实例化自己,并添加到UICollectionView. 为了使其工作,UICollectionViewCell实例需要.reuseIdentifier设置其属性。

通常,描述单元格的类或 Nib 会在集合视图中注册,并且集合视图会使用.reuseIdentifier已设置的单元格实例化单元格,使用以下方法:

- registerClass:forCellWithReuseIdentifier:
- registerNib:forCellWithReuseIdentifier:

但是,由于我在集合视图之外构建此单元格,因此这些不适用。

当我自己创建单元格时,似乎无法设置它.reuseIdentifier(因为它是只读属性,并且没有init...初始化它的方法)。

.reuseIdentifier未设置时UICollectionView,添加单元格时会引发异常。此行为不同于UITableView,其中重用标识符是可选的。

设置集合视图单元格的重用标识符的一种简单解决方法是将其嵌入.xib文件中并使用该Identifier框,然后使用

[NSBundle.mainBundle loadNibNamed:@"MyCellName" owner:self options:nil][0];

然后我可以通过上述实例化UICollectionViewCell并且一切正常。

...但这似乎是一个非常愚蠢和任意的箍跳。是否有其他方法可以在没有.xib-wrapper 绕行的情况下在单元实例上设置此属性?


更新:Apple 的文档是这样说的:

为了简化代码的创建过程,集合视图要求您始终使视图出列,而不是在代码中显式创建它们。

...这实际上是不正确的,因为它不需要这个(即,只要以某种方式设置了它们的标识符,外部实例单元就可以正常工作,例如,如果从 a 加载.xib),它也不会“简化我的代码的创建过程”在我的特定用例中(需要一个额外的文件;此外,要求集合视图创建这几个复杂的一次性文件会很麻烦)。

但是上面的内容似乎暗示这个问题的答案是否定的:故意“很难”创建一个可用的单元格,除非让集合视图出列它。

4

2 回答 2

4

我很抱歉这么说,但我认为您将不得不接受这样一个事实,即 UICollectionView 是生产 UICollectionViewCells 的唯一 Apple 品牌工厂。因此,如果您有两个要在其中显示完全相同的对象的集合视图,那么您就不走运了!

好消息是,如果您有两个集合视图,您希望在其中显示一个看起来与另一个完全相同的单元格,那么您可以完成您的任务。这很简单:

@interface MyModelClass : NSObject
  // a bunch of data
@end


@interface MyCollectionViewCell : UICollectionViewCell
-(void)refreshCellWithObject:(MyModelClass *)object;
@end

同时,在哪个类中拥有 UICollectionView cv1 和 cv2

[[self cv1] registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCollectionViewCell"];

[[self cv2] registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCollectionViewCell"];

他们的数据源可以看起来相同

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
   MyModelObject *obj = [self theObjectIWant];

   MyCollectionViewCell *cell;

   cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCollectionViewCell" forIndexPath:indexPath];

   [cell refreshCellWithObject:obj];

   return cell;
}
于 2013-03-22T17:14:29.040 回答
2

使用这两种方法。

– registerNib:forCellWithReuseIdentifier:
– dequeueReusableCellWithReuseIdentifier:forIndexPath:

参见苹果的UICollectionView 类参考

于 2012-11-08T04:21:08.217 回答