2010-03-03 61 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