前者在KVC Prog指南中進行了描述,但是在雪豹的Xcode 4.0.2(帶有iOS 4.3 SDK)安裝的iOS API中沒有列出,後者列出了後者。 這是用於iOS 2.0或更高版本。謝謝。要實現KVC驗證方法,覆蓋 - (BOOL)validateIvar:error:或-validateValue:forKey:error:?
3
A
回答
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
您應該只執行模式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
相關問題
- 1. KVC驗證方法中的類型是否重要?
- 2. HoloEverywhere方法不會覆蓋或實現超類型的方法
- 3. 方法不覆蓋或實現超類型的方法
- 4. 錯誤:方法不覆蓋或從超實現方法
- 5. 該方法必須覆蓋或實現超方法
- 6. 爲了驗證而覆蓋mutator方法
- 7. RestKit KVC驗證不會調用驗證方法
- 8. 如何實現方法覆蓋接口
- 9. 實現覆蓋線程終止方法
- 10. 覆蓋現有實例的方法
- 11. jQuery驗證 - 覆蓋核心驗證方法
- 12. 摘要IEqualityComparer實現或覆蓋默認比較器使用不同方法
- 13. 需要幫助覆蓋kendo ui驗證
- 14. onCreate |(Bundle)必須覆蓋或實現一個超類型方法
- 15. 在派生類上實現接口或覆蓋基本方法
- 16. 覆蓋主要方法
- 17. 實例C覆蓋方法#
- 18. 實時方法覆蓋
- 19. 覆蓋實例方法
- 20. 陣營原住民 - 錯誤:方法不覆蓋或實現從超的方法
- 21. React Native Android:方法不會覆蓋或實現超類型的方法
- 22. 錯誤:(44,5)錯誤:方法不會覆蓋或實現超類型的方法
- 23. Map實現爲什麼要覆蓋foreach?
- 24. Javascript驗證覆蓋ASP.NET驗證器
- 25. 覆蓋/隱藏明確實現的接口方法
- 26. 覆蓋Zend驗證消息
- 27. JSR 303的驗證覆蓋
- 28. Symfony2.1 FOSUserBundle覆蓋驗證
- 29. 導航實驗無法渲染覆蓋
- 30. 無法實現css漸變覆蓋
當然,你是對的。我在想什麼? Noobbish的錯誤。 –
@全球遊牧民沒有任何問題。我們只能慢慢學習,一個接一個。良好的黑客行爲! – Yuji
我不敢相信我沒有想到這一點。謝謝,把我從我自己的臨時瘋狂中拯救出來,可能很多時候都在追尋一個想象中的問題。 –