如何在不显式导入子类的情况下运行子类的超类方法实现?

时间:2014-09-25 01:09:32

标签: ios objective-c uicollectionview uicollectionviewcell

免责声明:我意识到我的半完整解决方案是非常规的。如果我(错误地)使用重用标识符会冒犯你,那么请考虑这是一个永远不会在生产代码中结束的思考练习。 :)


注册

我有一个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的要求太高了?你觉得怎么样?

0 个答案:

没有答案