免责声明:我意识到我的半完整解决方案是非常规的。如果我(错误地)使用重用标识符会冒犯你,那么请考虑这是一个永远不会在生产代码中结束的思考练习。 :)
我有一个UICollectionView
,有许多不同类型的单元格。所有这些单元类都继承自同一个超类:MyCollectionViewCell
。为了最小化copypasta,MyCollectionViewCell
有一个类助手方法+reuseIdentifiers
,它返回一个字符串数组,每个字符串都作为重用标识符和类名称(一旦传入NSClassFromString(...)
} 当然)。循环遍历此数组,我能够将所有单元子类注册为Collection View的可重用单元格,以获得正确的重用标识符。
for (NSString *reuse in [MyCollectionViewCell reuseIdentifiers]) {
[self registerClass:NSClassFromString(reuse) forCellWithReuseIdentifier:reuse];
}
好的,到目前为止?
当我尝试使用值设置我的一个单元格属性时,问题在-collectionView:cellForItemAtIndexPath:
中显现出来。这是我的队列:
MyActivityObject *activity = self.model[indexPath.row];
NSString *reuseId = [MyCollectionViewCell reuseIdentifierForActivity:activity];
MyCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseId forIndexPath:indexPath];
如果我在此处断开,我可以看到该单元格确实是MyCollectionViewCell
的子类的一个实例。但是,尝试设置单元格activity
属性的值只会运行MyCollectionViewCell
中的实现,而不是子类中的实现!
[cell setActivityObject:activity];
我希望避免显式地将单元格作为子类,因为子类很多。我尝试使用不明确的reuseId
“转换”单元格,但这会导致构建错误“预期表达式”:
[((NSClassFromString(reuseId) *)cell) setActivityObject:activity];
如果没有简单的方法可以做到这一点,我想我将不得不更常规地编写集合视图代码(即导入所有的单元子类,让集合视图决定使用哪个类,等等)。再一次,我只是想避免使用copypasta,但也许我对Objective-C的要求太高了?你觉得怎么样?