我喜欢在异构的UITableView as suggested by Matt Gallagher中抽象CellControllers的想法。但是,在典型的推送细节视图行为的情况下,我发现自己创建了几乎完全相同的LinkRowCellController
变体,这些变体的区别仅在于详细视图控制器的init
方法 - init:
, initWithBook:
,initWithMagazine:
,initWithHelpURLString:andTopic:
等
似乎我可以更改指定的初始值设定项以获取属性键和初始参数的字典,并使用LinkRowCellController
initWithProperties:
方法在传递的对上使用setValueForKey:
设置属性英寸
该解决方案似乎放弃了init
参数的编译时检查。 Objective-C中针对异构代码中的异构inits的最佳实践是什么?
更新
基于jlehr在下面的回答,我实现了一个带有单个方法initWithDictionary:(NSDictionary *)dict
的超类,所有方法都继承自:
- (id)initWithDictionary:(NSDictionary *)dict
{
if ((self = [super init]) != nil)
{
for (id key in dict) {
[self setValue:[dict objectForKey:key] forKey:key];
}
}
return self;
}
答案 0 :(得分:2)
在这种情况下使用-initWithDictionary:
方法并不罕见。但是,您需要的所有属性值都是-initWithObject:
- 没有必要将Book或Magazine翻译成字典,因为您可以将-valueForKey:
直接发送到模型对象根据需要自己。 (有关详细信息,请参阅NSKeyValueCoding)。
但我很想用包含配置信息的字典初始化CellController,例如组的标题和页脚,以及单个单元格的设置,例如附件,图像文件路径,模型的关键路径这样就可以打开使用plist文件获取CellControllers配置信息的大门(我很想把它称为CellGroups,因为它们实际上只是一组单元格 - 但这只是我)。
然后,是的,您将进行编译时检查灵活性并减少代码大小。但是,这又是一个快速失败的场景(也就是说,当你走上关键路径时,你会立即得到运行时错误),所以我认为这是一个相当不错的权衡。作为交换,每当您需要添加新的表视图时,您需要做的就是创建一个新的plist。你可以用这样的东西初始化你的CellGroup:
- (id)initWithObject:(id)anObject configurationInfo:(NSDictionary *)info;
(并且,是的,您可以将对象粘贴在字典中,但我不认为这是一个胜利,特别是如果通过从文件系统中读取一个plist来获取字典。)