2

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

Apple 文档表明以下内容应该可以验证单个属性:

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

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

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

但不幸的是,它只是没有发生:(

然而,有趣的是,如果我使用下面的“catch all”方法,它确实有效:

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

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

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

4

1 回答 1

0

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

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

并且:

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

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

于 2012-09-08T12:51:36.797 回答