使用 NSDocument 和 NSWindow 跟踪 NSTextView 的变化
Posted
技术标签:
【中文标题】使用 NSDocument 和 NSWindow 跟踪 NSTextView 的变化【英文标题】:Tracking NSTextView changes with NSDocument and NSWindow 【发布时间】:2016-11-02 16:58:19 【问题描述】:我有一个基于文档的项目,Document.XIB 有这样的拓扑:
NSWindow --> NSTextView(在 NSScrollView 内)
我希望窗口和文档能够跟踪文本视图中的更改。具体来说,当文本视图中的文本发生变化时,窗口会被标记为已编辑,关闭按钮的状态也会发生变化。
从阅读AppKitUndo 看来,我应该将文档设置为文本视图的委托,并覆盖文档中的 undoManagerForTextView: 方法。但是当我在文本视图中键入字符时,窗口仍然没有更新(它的标题中没有“已编辑”,退出按钮也没有改变)。当我调用文档的 updateChangeCount: 时,状态也没有改变。我也试过将窗口设置为委托,仍然没有成功。
只有当我调用窗口的 setDocumentEdited: 时,窗口的退出按钮才会改变状态(但标题仍然不表示窗口已改变)。我觉得我在 XIB 中缺少一个非常简单的连接,但我不清楚它是什么。
【问题讨论】:
我试过这个(基于文档的项目,添加了 NSTextView)并且文档变脏了。你改变了什么? @Willeke 感谢您的测试。据我所知,没有任何改变。我发布了一个 GitHub 项目,其中包含重现该问题的代码。 在我的项目模板中,窗口连接到文件的所有者。窗口的代表是文件的所有者,文件所有者的窗口是窗口。你换了窗户吗? 非常感谢@Willeke,这与您所说的完全一致。我按照你说的设置了连接,问题解决了。 【参考方案1】:我今天遇到了这个。要正确跟踪文档的编辑状态,您必须在保存文本视图的内容时在 NSDocument
子类中调用 NSTextView.breakUndoCoalescing()
:
override func data(ofType typeName: String) throws -> Data
let textView = viewController.textView
textView.breakUndoCoalescing() <---
return Data()
来自docs:
在将接收者的内容保存到 保留对未保存更改和文档脏的正确跟踪 状态。
【讨论】:
以上是关于使用 NSDocument 和 NSWindow 跟踪 NSTextView 的变化的主要内容,如果未能解决你的问题,请参考以下文章