【问题标题】:Binded NSTextField doesn't update the entity until it lose the focus绑定的 NSTextField 在失去焦点之前不会更新实体
【发布时间】:2012-03-06 09:32:01
【问题描述】:

我有一个核心数据项目。

基本上我有一个 NSTableView,我在其中添加了一些实体(使用“添加:”选择器),双击 TableView 会打开一个新的 NSWindow,可以在其中使用一些 NSTextFields 编辑实体。 每个文本字段都绑定到实体的一个属性。

一切正常,除了实体的属性仅在文本字段失去焦点时更新。

如果我在第一个文本字段上书写,然后移至第二个,我的输入将被保存,但如果我在第一个文本字段上书写并关闭窗口,我的更改将丢失

如何在文本字段中写入内容后立即更新我的核心数据实体?我应该使用 textDidChange: 吗?

--- 更新 ---

很遗憾,[上下文保存] 不起作用。如果我理解正确,实体在 NSTextField 辞职第一响应者之前被修改。

目前唯一可行的解​​决方案是:

(void)controlTextDidChange:(NSNotification *)aNotification 
{
  NSTextField *tf = [aNotification object];
  [self.window makeFirstResponder:tf];
}

但这很不优雅,无论如何我还需要在 NSTextField 的末尾重新设置光标。

【问题讨论】:

    标签: xcode core-data binding nstextfield


    【解决方案1】:

    设置NSContinuouslyUpdatesValueBindingOption 将导致模型在每次文本字段更改时更新,从而正确设置脏标志并导致文档在退出时保存。

    【讨论】:

      【解决方案2】:

      我认为你可以使用 DidEndEditing 或 TextDidChange,另一种方法是在窗口关闭事件中处理,但我不推荐它。

      【讨论】:

      • 感谢您的快速回复。但我仍然想知道我需要在 DidEndEditing 中写什么?如何更新我的实体(或我的 NSObjectController)?
      • 我对核心数据不是很熟悉,但如果您需要在修改实体后保存上下文 ( [context save] ) ,我可以理解
      【解决方案3】:

      如果您还没有,您可以在窗口上设置一个代理并使用-windowWillClose: 或观察NSWindowWillCloseNotification。然后,您可以调用[[notification object] makeFirstResponder:[window initialFirstResponder]] 将窗口的第一响应者设置为窗口关闭时的初始第一响应者。这将导致作为第一响应者的控件(例如NSTextField)放弃第一响应者状态,并且绑定将保存更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多