Objective c 可可装订不';更改对象的-observeValueForKeyPath:中的属性时不起作用:更改:上下文:

Objective c 可可装订不';更改对象的-observeValueForKeyPath:中的属性时不起作用:更改:上下文:,objective-c,macos,cocoa,binding,key-value-observing,Objective C,Macos,Cocoa,Binding,Key Value Observing,因此,我将这个textFieldsomeField绑定到InterfaceBuilder(IB)中的属性someText。 在我的代码中的任何地方,当我更改someText时,someField内容会相应地更新,反之亦然 方法中以外的任何位置-observeValueForKeyPath:ofObject:change:context: 实际上,我正在观察someText,这样当文本字段中的值更改时,绑定会修改someText,我可以对其执行一些验证。 发生这种情况时,我可以执行以下操作: -

因此,我将这个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
中。但这不会发生


我显然错过了一些东西,但不知道是什么。任何帮助都将不胜感激!干杯。

您不应该在-observeValueForKeyPath:ofObject:change:context:中验证值,而应该执行以下操作:

-(BOOL)validateSomeText:(id *)ioValue error:(NSError * __autoreleasing *)outError
{
    ...
    if (enteredValueIsNotValid)
        *ioValue = validValue;
    return YES;
}
这应该适用于绑定(并且可以选择立即验证字段内容,即在字段“尝试辞去响应者的职务”之前),但是-setValue:forKey:不调用它,并且根据文档,您的设置者也不应该调用它


有关详细信息,请参见

Hey Baldoph,想知道你为什么删除了你的问题。你找到答案了吗?@JAL刚刚看到你的问题,对不起!我完全忘记了为什么我需要它,为什么我把它拿走了。。。恐怕帮不了什么忙:/