前者在KVC Prog指南中有描述,但是在安装了Xcode 4.0.2(带有iOS 4.3 SDK)的iOS API中,Snow Leopard中列出了后者。 这适用于iOS 2.0或更高版本。感谢。
答案 0 :(得分: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参考中定义的密钥setFoo:
的每个名为foo
的方法,对吗?
答案 1 :(得分: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