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关闭之后,怎么再找出来?在线急