2011-07-27 69 views

回答

3

您可以同時使用兩者。對於命名foo鍵,就可以實現一個特定的方法

-(BOOL)validateFoo:(id*)ioValue error:(NSError**)error { 
     ... 
} 

,或者非特異性方法

- (BOOL)validateValue:(id *)ioValue forKey:(NSString *)key error:(NSError **)outError { 
     if([key isEqualToString:@"foo"]){ 
      ... 
     }else{ 
      return [super validateValue:ioValue forKey:key error:outError]; 
     } 
    } 

這是非常明智的,你沒有找到API文檔中validateIvar:error:,因爲需要爲每個密鑰更改部分Ivar。對於在系統API參考中定義的密鑰foo,您沒有找到稱爲setFoo:的所有方法,對嗎?

+0

當然,你是對的。我在想什麼? Noobbish的錯誤。 –

+0

@全球遊牧民沒有任何問題。我們只能慢慢學習,一個接一個。良好的黑客行爲! – Yuji

+0

我不敢相信我沒有想到這一點。謝謝,把我從我自己的臨時瘋狂中拯救出來,可能很多時候都在追尋一個想象中的問題。 –

0

您應該只執行模式validate<Key>:error:(甚至可以在一個類別中完成)的方法。請勿覆蓋validateValue:forKey:error:,並且不要在驗證方法中調用validateValue:forKey:error:。你會造成無限循環。這包括在Key-Value Coding文檔和Core Data文檔以及Foundation標題中。 validateValue:forKey:error:是驗證的指定入口點,既適用於CoreData之類的框架,也適用於您的應用程序。

希望執行驗證的代碼應該調用validateValue:forKey:error:而不是直接使用自定義驗證方法。

例如:

if ([[self model] validateValue:&text forKey:@"name" error:&validationError]){ 
    [[self model] setValue:text forKey:@"name"]; 
} else { 
    [self didFailWithError:validationError]; 
} 

這應該不從存取方法中完成。行動方法是完成這個任務的理想場所。

可以看到一個工作示例here