Cocoa:在控制绑定中避免“持续更新”

时间:2012-03-30 22:41:24

标签: cocoa binding key-value-observing nstextfield

我有几个面板包含绑定到文件所有者对象中属性的NSTextField个控件。如果用户编辑某个字段,然后按 Tab ,要移至下一个字段,它将按预期工作。但是,如果用户未按 Tab 并按下OK按钮,则不会在文件的所有者对象中设置新值。

为了解决这个问题,我在绑定中设置了连续更新,但这必须是昂贵的(编辑:或者至少它不够优雅)。

有没有办法在按下确定按钮时强制执行绑定更新,而不是连续使用更新

3 个答案:

答案 0 :(得分:6)

你是对的,你不需要使用持续更新值选项。

如果你正在使用绑定(你是),那么你应该做的是调用管理绑定的-commitEditing子类的NSController方法。您通常会在关闭正在显示的工作表的方法中执行此操作。

-commitEditing告诉控制器在活动控件中完成编辑并将当前编辑提交给绑定对象。

每当执行持久性操作(如保存)时,最好调用它。

答案 1 :(得分:3)

解决方法是在OK按钮调用的action方法中“结束编辑”。由于窗格是NSWindowController的子类,NSWindow很容易访问,但是在您的代码中,您可能必须通过绑定到控制器的控件获取NSWindow;例如NSWindow *window = [_someControl window]

以下是我的okPressed操作方法的实现。

总之,我相信这是更好的解决方案,可以在绑定控件中设置 Continuously

- (IBAction)okPressed:(id)sender
{
    NSWindow *window = [self window];
    BOOL editingEnded = [window makeFirstResponder:window];
    if (!editingEnded)
    {
        logwrn(@"Unable to end editing");
        return;
    }

    if (_delegateRespondsToEditComplete)
    {
        [_delegate detailsEditComplete:&_mydetails];
    }
}

答案 2 :(得分:0)

虽然这已经很老了,但我绝对不同意这个问题是基于的假设。

重新更新绑定绝对不贵。我想你可能会认为这会持续更新价值,定期根据某些时间间隔理解#34;

但事实并非如此。这只是意味着每当您更改绑定值时它都会更新。这意味着,当您在textView中键入内容时,它会在您编写时更新;这就是你在这种情况下想要的。