管理同一窗口中多个 NSTextField 的撤消

问题描述 投票:0回答:1

虽然窗口中多个

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

运行时,看起来像这样:

window with 4 edit controls

现在,如果您编辑第一个和第二个文本视图,然后使用撤消两次,它将很好地撤消每个文本视图中的更改。

但是如果您对两个文本字段尝试相同的操作,例如通过用较短的文本(例如“1”和“2”)替换字段中较长的预设文本,您会发现撤消会替换同一活动文本字段中的文本两次:

enter image description here

如何使文本字段中的撤消行为正确,即与文本视图中的操作相同?

macos cocoa appkit nsundomanager
1个回答
0
投票

你有没有解决这个问题,我也遇到同样的问题?

© www.soinside.com 2019 - 2024. All rights reserved.