使用 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 的变化的主要内容,如果未能解决你的问题,请参考以下文章

防止自动加载上次打开的文档

NSDocument - 内存泄漏和应用程序崩溃

NSDocument 和键盘(如 keyDown)

在使用情节提要和 swift 时从 xib 打开 NSWindow

Cocoa 自定义 NSDocument 保存

NSDocument 和 writeToURL:ofType:error 的问题: