Objective c 要实现KVC验证方法,请重写-(BOOL)validateIvar:error:或-validateValue:forKey:error:?

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

前者在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:(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。”。我们只是慢慢地,一个接一个地学习。好黑客!真不敢相信我居然没想到。谢谢,把我从暂时的精神错乱中解救了出来,也许还有很多时间去解决一个想象中的问题。