Cocoa Inspector - 关闭最后一个文档后如何重置窗口标题

时间:2017-03-14 07:52:40

标签: cocoa nsdocument nswindowcontroller

我的基于文档的cocoa应用程序有一个共享检查器窗口,其内容根据活动的文档而变化。

检查器窗口控制器是一个共享单例,可根据需要从其故事板中实例化。

文档类只是从故事板创建其主窗口,并成为窗口的委托:

class Document: NSDocument {

    override func makeWindowControllers() {
    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    guard let windowController = storyboard.instantiateController(withIdentifier: "Document Window Controller") as? NSWindowController else {
        fatalError("Storyboard Inconsistency!")
    }

    windowController.window?.delegate = self

    self.addWindowController(windowController)
}

每当文档的主窗口变为活动状态时,它会将检查器的窗口控制器添加到它自己的窗口:

extension Document: NSWindowDelegate {

    func windowDidBecomeMain(_ notification: Notification) {
        self.addWindowController(InspectorWindowController.shared)
    }
}

(这也会更新窗口控制器的document属性)

在预期最后一份文件被关闭的情况下,我还补充说:

func windowWillClose(_ notification: Notification) {
    self.removeWindowController(InspectorWindowController.shared)
}

(这仅适用于最后一个文档,因为否则新的活动文档会接管,并且一旦将窗口控制器添加到新激活的文档中,窗口控制器就会自动从关闭文档中删除) < / p>

Inspector本身会覆盖属性document和方法windowTitle(forDocumentDisplayName:),以便跟上活动文档:

类InspectorWindowController     覆盖var文档:AnyObject? {         didSet {             //(更新视图控制器的内容)         }     }

override func windowTitle(forDocumentDisplayName displayName: String) -> String {
     if document == nil {
          return "Inspector - No Active Document"
     } else {
          return "Inspector - \(displayName)"
     }
}

问题是,当我关闭上一个打开的文档窗口时,检查员的窗口标题保留在最后一个文档的(自定义)标题集上。也就是说,当检查器窗口控制器的document属性设置为nil时, windowTitle(forDocumentDisplayName:)不会被调用

即使致电synchronizeWindowTitleWithDocumentName()也无济于事,因为文档明确提到:

  

如果窗口控制器没有关联的文档,则不执行任何操作或   加载窗口。此方法查询窗口控制器的文档   获取文档的显示名称和完整文件名路径,然后调用   windowTitle(forDocumentDisplayName :)获取要显示的显示名称   在窗口标题中。

(强调我的)

我可以将Inspector的内容重置为“No document”状态;如何为窗口标题执行相同操作?

1 个答案:

答案 0 :(得分:0)

好的,我找到了(愚蠢而明显的)答案:

override var document: AnyObject? {
    didSet {
        // (Update view controller's contents, etc...)

        if document == nil {
            self.window?.title = "Inspector - No Active Document"
        }
    }
}

我不确定这是否是处理它的正确方法,但它确实完成了工作。

我会接受任何更好的答案。