我正在编写一个包含几个NSTextField的Cocoa应用程序。我正在尝试将对文本字段中文本的更改传播到我的模型层,但由于我在更新模型时注册了撤消操作,这使得它比仅仅监听controlTextDidChange:
更复杂。 / p>
如果我挂钩委托方法controlTextDidChange:
,那么每按一次键就会调用一次。如果我更新模型,那么模型会将每个单独的按键视为单独的撤消事件。这是不可取的。我想要的是在撤销管理器注册默认的“撤消键入”操作时收到通知,这样我就可以更新模型了。当我暂停键入片刻时,NSTextField会注册一个(也是唯一一个)此类事件。不幸的是,我不知道何时发生这种情况。
我已经尝试过监听controlTextDidEndEditing:
,并在该委托方法中更新模型,但是在模型更新之前我必须明确地标出文本字段。由于我将模型对象直接存档在我的NSDocument
子类中,如果用户在更改文本字段的内容后保存文档,则会导致用户数据丢失,但不会在文本字段之外删除首先,因为该模型不会及时更新。因此,这种技术不起作用。
我还尝试连接到文本字段的字段编辑器(在control:textShouldBeginEditing:
期间)并监听textDidEndEditing:
,但后来我发现这根本不会触发,因此模型不会更新,导致数据丢失,如上一段所述。任何人都可以帮我解决这个问题吗?谢谢!
答案 0 :(得分:0)
默认情况下,Apple NSTextField会保留您提到的悬空编辑。 由于这个问题,除其他外,我将NSTextField和NSApplication子类化为处理文本字段编辑的处理方式:按“Enter”,在字段外单击,其他操作应该结束编辑并生成Undo条目。
另外,我强烈建议更换NSUndoManager的GCUndoManager。