NSTextField编辑合并

时间:2017-11-18 19:42:05

标签: cocoa nstextfield

我正在编写一个包含几个NSTextField的Cocoa应用程序。我正在尝试将对文本字段中文本的更改传播到我的模型层,但由于我在更新模型时注册了撤消操作,这使得它比仅仅监听controlTextDidChange:更复杂。 / p>

如果我挂钩委托方法controlTextDidChange:,那么每按一次键就会调用一次。如果我更新模型,那么模型会将每个单独的按键视为单独的撤消事件。这是不可取的。我想要的是在撤销管理器注册默认的“撤消键入”操作时收到通知,这样我就可以更新模型了。当我暂停键入片刻时,NSTextField会注册一个(也是唯一一个)此类事件。不幸的是,我不知道何时发生这种情况。

我已经尝试过监听controlTextDidEndEditing:,并在该委托方法中更新模型,但是在模型更新之前我必须明确地标出文本字段。由于我将模型对象直接存档在我的NSDocument子类中,如果用户在更改文本字段的内容后保存文档,则会导致用户数据丢失,但不会在文本字段之外删除首先,因为该模型不会及时更新。因此,这种技术不起作用。

我还尝试连接到文本字段的字段编辑器(在control:textShouldBeginEditing:期间)并监听textDidEndEditing:,但后来我发现这根本不会触发,因此模型不会更新,导致数据丢失,如上一段所述。任何人都可以帮我解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:0)

默认情况下,Apple NSTextField会保留您提到的悬空编辑。 由于这个问题,除其他外,我将NSTextField和NSApplication子类化为处理文本字段编辑的处理方式:按“Enter”,在字段外单击,其他操作应该结束编辑并生成Undo条目。

另外,我强烈建议更换NSUndoManager的GCUndoManager。