我有几个面板包含绑定到文件所有者对象中属性的NSTextField
个控件。如果用户编辑某个字段,然后按 Tab ,要移至下一个字段,它将按预期工作。但是,如果用户未按 Tab 并按下OK按钮,则不会在文件的所有者对象中设置新值。
为了解决这个问题,我在绑定中设置了连续更新,但这必须是昂贵的(编辑:或者至少它不够优雅)。
有没有办法在按下确定按钮时强制执行绑定更新,而不是连续使用更新?
答案 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中键入内容时,它会在您编写时更新;这就是你在这种情况下想要的。