Objective c 要实现KVC验证方法,请重写-(BOOL)validateIvar:error:或-validateValue:forKey:error:?
前者在KVC Prog指南中有描述,但在与雪豹的Xcode 4.0.2(iOS 4.3 SDK)一起安装的iOS API中缺少,后者列出了后者。Objective c 要实现KVC验证方法,请重写-(BOOL)validateIvar:error:或-validateValue:forKey:error:?,objective-c,ios,Objective C,Ios,前者在KVC Prog指南中有描述,但在与雪豹的Xcode 4.0.2(iOS 4.3 SDK)一起安装的iOS API中缺少,后者列出了后者。 这适用于iOS 2.0或更高版本。谢谢。两者都可以使用。对于名为foo的键,您可以实现一个特定的方法 -(BOOL)validateFoo:(id*)ioValue error:(NSError**)error { ... } 或者,非特定方法 - (BOOL)validateValue:(id *)ioValue forKey:(N
这适用于iOS 2.0或更高版本。谢谢。两者都可以使用。对于名为
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:
的方法,是吗?您应该只实现以下模式的方法验证:错误:
(即使在类别中也可以这样做)。不要重写validateValue:forKey:error:
,也不要从验证方法中调用validateValue:forKey:error:
。您将导致一个无限循环。这包括在文档和文档中,以及基金会标题中。code>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];
}
这不应该在访问器方法内完成。行动方法是实现这一目标的最佳场所
可以看到一个有效的例子你当然是对的。我在想什么?“这是个愚蠢的错误。没问题,@globalnomad。”。我们只是慢慢地,一个接一个地学习。好黑客!真不敢相信我居然没想到。谢谢,把我从暂时的精神错乱中解救了出来,也许还有很多时间去解决一个想象中的问题。