【发布时间】:2020-11-03 07:08:53
【问题描述】:
我有一个非直接可编辑格式的 NSDocument,它是对 XML 内容的描述。 NSWindow 有一个与之关联的设置视图控制器,它可以很好地处理文档中的数据,撤消按预期工作,保存等。现在在 NSWindow 中还有一个 NSTextView,用户可以在其中输入一些文本,但不是文档内容的一部分,它仅用作临时文本。当然我也想支持这个文本的撤消,所以我在 Interface Builder 中为这个 NSTextView 启用了“撤消”复选标记,撤消效果很好。
现在问题来了:当 NSTextView 被修改时,NSDocument 被标记为脏。因为这是临时文本,所以我不希望用户被唠叨保存对文档的更改,这些更改实际上不属于文档。
如何将 NSTextView 从导致 NSDocument 的撤消管理器实例的响应程序链中分离出来?简单地提供一个新的 NSUndoManager 实例并不能解决它,因为它也只是沿着响应者链上升到 NSDocument。
extension InputViewController: NSTextViewDelegate {
func undoManager(for view: NSTextView) -> UndoManager? {
return myUndoManager
}
}
【问题讨论】:
-
我试过你的代码,它对我有用。代表是否已连接/设置?
undoManager(for:)被调用了吗?请发帖minimal reproducible example。 -
代码没有错,我只是用它来表达我的意思“提供一个新的NSUndoManager实例”
-
文档没有被标记为脏。只需提供一个新的 NSUndoManager 实例就可以解决它。有什么问题?
-
好吧,好吧。我重新测试了这个,你瞧,这很好用。我一直都有答案。感谢您坚持推动我这样做。
-
..但是,它破坏了设置视图控制器的撤消管理器。我真的只想要一个撤消管理器,因此我选择了下面的答案,使用
updateChangeCount覆盖。
标签: macos cocoa nstextview nsdocument