在-observeValueForKeyPath:ofObject中更改属性时,Cocoa绑定无效:更改:context:

时间:2014-04-12 20:00:25

标签: objective-c macos cocoa binding key-value-observing

所以我将这个textField someField绑定到InterfaceBuilder(IB)中的属性someText。 在我的代码中的任何位置,当我更改someText时,someField内容会相应更新,反之亦然。

在方法-observeValueForKeyPath:ofObject:change:context:

中的任何地方

确实我正在观察someText,以便当文本字段中的值发生更改时,绑定会修改someText,我可以对其执行一些验证。 发生这种情况时,我可以执行以下操作:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    [...]
    //keyPath is @"someText"
    if (enteredValueIsNotValid) {
        [object setValue:validValue forKey:keyPath];
    }
    [...]
}

致电[object setValue:validValue forKey:keyPath]后,someText获取了值validValue。就像预期一样。但由于招标已到位,我还希望validValue能够显示在我的文字字段someField中。但它不会发生!!

我显然错过了一些但却无法弄明白的东西。任何帮助将不胜感激!欢呼声。

1 个答案:

答案 0 :(得分:2)

而不是验证-observeValueForKeyPath:ofObject:change:context:中的值,你应该这样做:

-(BOOL)validateSomeText:(id *)ioValue error:(NSError * __autoreleasing *)outError
{
    ...
    if (enteredValueIsNotValid)
        *ioValue = validValue;
    return YES;
}

这应该适用于绑定(并且可以选择立即验证字段内容,即在字段“尝试作为响应者重新签名”之前),但是-setValue:forKey:不会调用它并根据文档你的二传手不应该。

有关详细信息,请参阅https://developer.apple.com/library/mac/documentation/cocoa/conceptual/KeyValueCoding/Articles/Validation.html