虽然窗口中多个
NSTextView
的撤消操作会持续有效,但默认情况下 NSTextField
控件的情况并非如此。
我喜欢让
NSTextField
的撤消行为与 NSTextView
的撤消行为相同。
到目前为止,我发现
NSTextField
使用自己的私有NSUndoManager
,它确实自动启用和处理撤消/重做菜单,但不使用窗口的共享undoManager
,并且不将连接的文档标记为脏(“已编辑”):如果我向 NSUndoManager
提供私有 NSTextField
实例,它的行为会相同。
所以我尝试通过覆盖
undoManagerForTextView:
,让窗口中的 NSTextField
使用窗口的共享 undoManager
。这确实会导致文本字段共享相同的撤消堆栈的效果,并且我仍然可以在编辑后发出撤消,然后留下特定的文本字段。
但是,问题是它会崩溃,因为撤消似乎应用到了错误的(即当前活动的)文本字段,而不是创建撤消操作的文本字段。
我在这里提供了一个简单的示例:https://github.com/tempelmann/Undo_shared_NSTextFields
这是一个新创建的基于文档的应用程序,主窗口中有两个文本字段和两个文本视图。为了启用文本字段的共享撤消管理器,我创建了
NSTextField
的子类(“CustomTextField”),它重写以下函数以提供共享撤消管理器:
-(NSUndoManager *)undoManagerForTextView:(NSTextView *)view { // NSTextViewDelegate
return view.window.undoManager;
}
故事板中的文本字段设置为该子类,而不是
NSTextField
。
运行时,看起来像这样:
现在,如果您编辑第一个和第二个文本视图,然后使用撤消两次,它将很好地撤消每个文本视图中的更改。
但是如果您对两个文本字段尝试相同的操作,例如通过用较短的文本(例如“1”和“2”)替换字段中较长的预设文本,您会发现撤消会替换同一活动文本字段中的文本两次:
如何使文本字段中的撤消行为正确,即与文本视图中的操作相同?
你有没有解决这个问题,我也遇到同样的问题?