Objective c UICollectionViewCell上的Setting.reuseIdentifier
我有一个特定的Objective c UICollectionViewCell上的Setting.reuseIdentifier,objective-c,xcode,interface-builder,nib,uicollectionview,Objective C,Xcode,Interface Builder,Nib,Uicollectionview,我有一个特定的UICollectionViewCell,我想实例化自己,并将其添加到UICollectionView。为了使其工作,需要设置UICollectionViewCell实例的.reuseIdentifier属性 通常,描述单元格的类或Nib将注册到集合视图中,集合视图将使用已设置的.reuseIdentifier实例化单元格,方法如下: - registerClass:forCellWithReuseIdentifier: - registerNib:forCellWithReuse
UICollectionViewCell
,我想实例化自己,并将其添加到UICollectionView
。为了使其工作,需要设置UICollectionViewCell
实例的.reuseIdentifier
属性
通常,描述单元格的类或Nib将注册到集合视图中,集合视图将使用已设置的.reuseIdentifier
实例化单元格,方法如下:
- registerClass:forCellWithReuseIdentifier:
- registerNib:forCellWithReuseIdentifier:
但是,由于我在集合视图之外构造此单元格,因此这些不适用
当我自己创建单元格时,似乎无法设置其.reuseIdentifier
(因为它是一个只读属性,并且没有初始化它的init…
方法)
如果未设置.reuseIdentifier
,则添加单元格时,UICollectionView
会引发异常。此行为不同于UITableView
,在UITableView中,重用标识符是可选的
设置集合视图单元格的重用标识符的一个简单解决方法是将其嵌入.xib
文件中,并使用标识符
框,然后使用
[NSBundle.mainBundle loadNibNamed:@"MyCellName" owner:self options:nil][0];
然后,我可以传递上面实例化的UICollectionViewCell
,一切正常
…但这似乎是一个相当愚蠢和武断的圈套。是否有其他方法可以在没有.xib
-包装绕道的情况下在单元格实例上设置此属性
更新:苹果的文档中说: 为了简化代码的创建过程,集合视图要求您始终将视图出列,而不是在代码中显式创建它们 …这实际上是不正确的,因为它不需要这样做(即,外部实例化的单元可以正常工作,只要它们的标识符以某种方式设置,例如,如果从
.xib
加载),并且在我的特定用例中,它也不会“简化代码的创建过程”(而是需要一个额外的文件;此外,要求collection视图创建这几个复杂的一次性文件会很麻烦)
但是上面的内容似乎确实暗示了问题的答案是否定的:创建一个可用的单元格是故意的“困难”,除非让集合视图将其出列。使用这两种方法
– registerNib:forCellWithReuseIdentifier:
– dequeueReusableCellWithReuseIdentifier:forIndexPath:
看到苹果的我很抱歉这么说,但我想你必须接受这样一个事实: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"];
及
它们的数据源看起来是一样的
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MyModelObject *obj = [self theObjectIWant];
MyCollectionViewCell *cell;
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCollectionViewCell" forIndexPath:indexPath];
[cell refreshCellWithObject:obj];
return cell;
}
上述方法的工作原理与宣传的一样,但这并不能回答我的问题。我在这里所做的是将一些任意的一次性单元格传递给其他地方正在构建的集合视图。此外,我要问的是如何避免使用.xib。是否要构建UICollectionViewCell使用代码,然后在其他地方使用它?正确,我没有nt调用
UICollectionViewCell
子类上的某种init
方法,然后在集合视图中显示该特定实例。我已经搜索过,我认为您只能从.xib文件加载该实例。对此表示歉意。我想可能有一些技巧可以用来直接设置属性;请参阅que上的第一条注释stion.但是使用.xib
似乎是最安全的方法。也许这会有帮助:((它适用于表视图单元格,但我认为它也适用于集合视图单元格。)谢谢,这是一个值得尝试的好方法。我还想知道setValue:forKey
“是否适用于只读
位:)“我认为你必须接受这样一个事实:UICollectionView是唯一一家生产UICollectionViewCells的苹果品牌工厂。“但显然可以使用xib创建UICollectionViewCells,而不使用UICollectionView。你可能是对的,但今年早些时候,经过长时间的实验,我决定采用苹果推荐的做法。请参阅我的相关问答。它引用了一位苹果工程师的话,你能提供refreshCellWithObject:method的实现吗?如何使用reuseidentifier刷新单元格。该方法是基于给定对象填充所有单元格视图的方法。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MyModelObject *obj = [self theObjectIWant];
MyCollectionViewCell *cell;
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCollectionViewCell" forIndexPath:indexPath];
[cell refreshCellWithObject:obj];
return cell;
}