2010-03-03 64 views
2

我喜欢在异构UITableView as suggested by Matt Gallagher中抽象CellControllers的想法。然而,在典型的推详细视图行为的情况下,我发现自己创造,只有详细视图控制器的init方法不同的LinkRowCellController几乎相同的变种 - init:initWithBook:initWithMagazine:initWithHelpURLString:andTopic:如何统一处理仅通过初始化属性不同的类对象?

好像我可以改变指定初始化采取属性键和初始参数的字典,并有LinkRowCellControllerinitWithProperties:方法设置使用上通过了对setValueForKey:属性。

这种解决方案似乎给了编译时间检查init的论点。 Objective-C中针对其他均匀代码中异构inits的最佳实践是什么?

UPDATE:

基于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; 
} 

回答

2

的情况并不少见有一个-initWithDictionary:方法在这样的情况下, 。但是,您需要的所有属性值都是-initWithObject: - 因为您可以根据需要将-valueForKey:直接发送到模型对象本身,因此不需要将书籍或杂志翻译成字典。 (有关更多详细信息,请参阅NSKeyValueCoding)。

但我很想用包含配置信息的字典初始化CellController,比如组的标题和页脚,以及单个单元格的设置,例如附件,图像文件路径,关键路径模型值等。这将打开使用plist文件为您的CellControllers的配置信息的大门(我会试图调用CellGroups,因为它们实际上只是一组单元 - 但这只是我)。

然后,是的,你会交易编译时检查灵活性和减少代码大小。但是,这又是一个快速失败的情况(即,当你走上一条关键路径时,你会马上得到运行时错误),所以我认为这是一个相当不错的折衷。作为交换,只要你需要添加一个新的表格视图,你所需要做的就是创建一个新的plist。你可以用这样的初始化CellGroups:

- (id)initWithObject:(id)anObject configurationInfo:(NSDictionary *)info; 

(是的,你可以只坚持字典里面的对象,但我不认为这是一个双赢,特别是如果字典是通过从文件系统中读取plist来获取)。

+0

它看起来很干净。我已经开始讨论一个不同的粘性问题集,但是当我回来时让我试试这个。 – iPhoneDollaraire 2010-03-06 02:26:37

+0

我试了一下,它像一个冠军! (太多了,以至于我很惊讶这不是NSObject的标准方法?) 我正在使用它来设置运行时的值,因此我不确定plist方法是否可以帮助我这次。 – iPhoneDollaraire 2010-03-07 22:03:01