我的基于文档的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”状态;如何为窗口标题执行相同操作?
答案 0 :(得分:0)
override var document: AnyObject? {
didSet {
// (Update view controller's contents, etc...)
if document == nil {
self.window?.title = "Inspector - No Active Document"
}
}
}
我不确定这是否是处理它的正确方法,但它确实完成了工作。
我会接受任何更好的答案。