如何实现键值编码验证

时间:2012-09-08 10:03:37

标签: objective-c xcode cocoa-bindings key-value-coding

我有一个ArrayController绑定到主/详细UI,它工作得很好。我现在正试图在模型级别实现验证。

Apple docs表示以下内容可用于验证各个属性:

-(BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError

因此,如果我的模型属性为“ProjectName”,则应自动触发以下内容:

-(BOOL)validateProjectName:(id *)ioValue error:(NSError * __autoreleasing *)outError

但不幸的是,它不会发生:(

然而,有趣的是,如果我使用如下所示的“全部捕获”方法,它可以工作:

-(BOOL)validateValue:(inout __autoreleasing id *)ioValue forKey:(NSString *)inKey error:(out NSError *__autoreleasing *)outError  {

在方法中我可以编码来确定当然正在验证哪个属性,但我无法弄清楚为什么它完全忽略了访问器方法?

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

验证方法不会自动触发 - 来自您的链接文档:

  

通常,键值编码不会自动执行验证 - 您的应用程序有责任调用验证方法。

还有:

  

您可以直接调用验证方法,也可以调用validateValue:forKey:error:并指定密钥。 validateValue的默认实现:forKey:error:在接收器的类中搜索名称与模式validate:error:的名称匹配的验证方法。如果找到这样的方法,则调用它并返回结果。如果找不到这样的方法,则validateValue:forKey:error:返回YES,验证该值。

这解释了你的第二种情况。