【问题标题】:Cocoa binding does't work when changing property in -observeValueForKeyPath:ofObject:change:context:更改 -observeValueForKeyPath:ofObject:change:context 中的属性时,Cocoa 绑定不起作用:
【发布时间】:2014-04-12 20:00:25
【问题描述】:

所以我将这个 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 中。但它不会发生!

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

【问题讨论】:

  • 嗨 Baldoph,很好奇你为什么删除了你的问题 here。你找到答案了吗?
  • @JAL 刚刚看到您的问题,对不起!我完全忘记了为什么需要它,为什么要删除它……恐怕在这里没有太大帮助:/

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


【解决方案1】:

您应该这样做,而不是验证 -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

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 2020-03-03
    • 1970-01-01
    • 2019-03-24
    • 2021-09-01
    • 2017-08-26
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多