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

时间:2011-07-27 17:00:53

标签: objective-c ios

前者在KVC Prog指南中有描述,但是在安装了Xcode 4.0.2(带有iOS 4.3 SDK)的iOS API中,Snow Leopard中列出了后者。 这适用于iOS 2.0或更高版本。感谢。

2 个答案:

答案 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