2013-04-11 77 views
2

我有一個tableView(這是一個具有大約11個領域的形式),tableViewController和我正在使用的類的實例是窗體的模型。 tableView控制器使用KVO更新模型進行更新。因此,而不是11如果是比較的keyPath串在我的觀察值的關鍵方法是這樣ELSE語句 -這會被認爲是良好的編程習慣,當使用KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keypath isEqualToSTring:@"name"]){ 
     [self updateName]; 
    } 
    else if([keypath isEqualToSTring:@"age"]){ 
     [self updateAge]; 
    } 
    etc,etc,etc... 
} 

我雖然這將是清潔劑有這樣的事情,只是遵循更新的命名約定方法

// KVO update methods name follow the naming convention "update<keypath>". 
// The first character of the keypath should be capitalised. 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSString * firstCharacterOfKeyPath = [keyPath substringToIndex:1]; 
    NSString * capitalisedFirstCharacterOfKeyPath = [firstCharacterOfKeyPath uppercaseString]; 
    NSRange firstCharacterRange = NSMakeRange(0, 1); 
    NSString * capitalisedKeyPath = [keyPath stringByReplacingCharactersInRange:firstCharacterRange withString:capitalisedFirstCharacterOfKeyPath]; 
    NSString * updateSelectorString = [[NSString alloc] initWithFormat:@"update%@",capitalisedKeyPath]; 
    SEL updateSelector = NSSelectorFromString(updateSelectorString); 
    [self performSelector:updateSelector]; 
} 

我不確定這是否被認爲是好的做法。

+1

根本沒有問題 – 2013-04-11 11:32:59

回答

2

我沒有看到任何真正的問題在你的代碼,但是我已經添加檢查,如果self響應選擇器,以防止進一步的崩潰:

if ([self respondsToSelector:updateSelector]) 
{ 
    [self performSelector:updateSelector]; 
} 

不過,我個人真的不喜歡KVO方法。我不想說這很糟糕,但它可能會產生不必要的錯誤。即你應該記得正確地移除觀察者,這在UITableView的情況下可能不是微不足道的。

儘管看起來有點複雜,但我建議在這裏使用委託方法,但對我來說聽起來更可靠。

相關問題