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

Posted

技术标签:

【中文标题】Cocoa Inspector - 如何在关闭最后一个文档后重置窗口标题【英文标题】:Cocoa Inspector - How to Reset Window Title After Closing Last Document 【发布时间】:2017-03-14 07:52:39 【问题描述】:

我的基于文档的 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)

(这仅对最后一个文档需要,否则新的活动文档会接管,并且一旦将窗口控制器添加到新激活的文档中,窗口控制器就会自动从关闭文档中删除)

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

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

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

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

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

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

(强调我的)

我可以将 Inspector 的内容重置为“无文档”状态;我怎样才能对窗口标题做同样的事情?

【问题讨论】:

最后一个文档关闭时检查器窗口控制器的标题应该是什么? 类似于“Imnspector(未选择文档)”的内容(它已经在问题中)。无论如何,最后一个文件的名称——已关闭——是不好的。 【参考方案1】:

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

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

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

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

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

【讨论】:

我正打算这么建议,或者func removeDocument(NSDocument),或者var currentDocument: NSDocument?...

以上是关于Cocoa Inspector - 如何在关闭最后一个文档后重置窗口标题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 WebSockets 合并到 Cocoa 应用程序中[关闭]

unity中的inspector关闭之后,怎么再找出来?在线急

如何以编程方式创建 Cocoa 应用程序主菜单应用程序 [关闭]

使用 Cocoa 的可扩展服务器 [关闭]

Cocoa:从另一个窗口创建并关闭一个窗口

COCOA - 如何在NSTextfield中达到最大长度时,文本字段不允许输入文本?