我有一个特定的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,一切都正常。
...but,这似乎是一个相当愚蠢和武断的循环跳过去。是否有其他方法可以在没有.xib-wrapper绕行的情况下在单元实例上设置此属性?
更新:苹果公司的文档显示:
为了简化代码的创建过程,集合视图要求始终对视图进行排线,而不是在代码中显式地创建视图。
...which实际上不是真的,因为它不需要这样做(例如,外部实例单元格只要以某种方式设置它们的标识符,例如从.xib加载),而且它在我的特定用例中也没有“简化我的代码的创建过程”(更需要一个额外的文件;此外,要求集合视图创建这几个复杂的一次性操作也会很麻烦)。
但以上所述似乎暗示了问题的答案是否定的:除了让集合视图对其进行排队列之外,创建一个可用的单元格是有意“困难”的。
发布于 2013-03-22 17:14:29
我很抱歉地说,但我认为你必须接受这样一个事实: UICollectionView是生产UICollectionViewCells的唯一的苹果品牌工厂。因此,如果您有两个集合视图,希望在其中显示完全相同的对象,那么您就倒霉了!
好消息是,如果您有两个集合视图,希望在其中显示一个与另一个单元格完全相同的单元格,那么您可以完成任务。这很简单:
@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;
}发布于 2012-11-08 04:21:08
使用这两种方法。
– registerNib:forCellWithReuseIdentifier:
– dequeueReusableCellWithReuseIdentifier:forIndexPath:见苹果的UICollectionView类引用
https://stackoverflow.com/questions/13281631
复制相似问题