Cocoa Inspector - 如何在关闭上一个文档后重置 Window 标题
Cocoa Inspector - How to Reset Window Title After Closing Last Document
我的 document-based cocoa 应用程序有一个共享检查器 window 其内容会根据处于活动状态的文档而变化。
检查器window控制器是一个共享单例,根据需要从故事板实例化。
文档 class 只是从故事板创建其主要 window,并成为 window 的委托:
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)
}
每当文档的主 window 激活时,它会将检查器的 window 控制器添加到它自己的:
extension Document: NSWindowDelegate {
func windowDidBecomeMain(_ notification: Notification) {
self.addWindowController(InspectorWindowController.shared)
}
}
(这也会更新 window 控制器的 document
属性)
预料到最后一个文档被关闭的情况,我还补充了:
func windowWillClose(_ notification: Notification) {
self.removeWindowController(InspectorWindowController.shared)
}
(只有最后一个文档才需要,否则新的活动文档将接管并且 window 控制器在添加到新的文档后会自动从关闭文档中删除激活文件)
Inspector 本身覆盖 属性 document
和方法 windowTitle(forDocumentDisplayName:)
,以便跟上活动文档:
class InspectorWindowController
覆盖 var 文档:AnyObject? {
didSet {
//(更新视图控制器的内容)
}
}
override func windowTitle(forDocumentDisplayName displayName: String) -> String {
if document == nil {
return "Inspector - No Active Document"
} else {
return "Inspector - \(displayName)"
}
}
问题 是,当我关闭最后打开的文档 window 时,检查器的 window 标题停留在为最后一个文件。即当inspectorwindowcontroller的document
属性设置为nil
时,不会调用windowTitle(forDocumentDisplayName:)
。
即使调用 synchronizeWindowTitleWithDocumentName()
也无济于事,因为文档明确提到:
Does nothing if the window controller has no associated document or
loaded window. This method queries the window controller’s document to
get the document’s display name and full filename path, then calls
windowTitle(forDocumentDisplayName:) to get the display name to show
in the window title.
(强调我的)
我可以将 Inspector 的内容重置为 "No document" 状态;我怎样才能对 window 标题做同样的事情?
好的,我找到了(愚蠢而明显的)答案:
override var document: AnyObject? {
didSet {
// (Update view controller's contents, etc...)
if document == nil {
self.window?.title = "Inspector - No Active Document"
}
}
}
我不确定这是否是处理它的正确方法,但它确实完成了工作。
我会接受任何更好的答案。
我的 document-based cocoa 应用程序有一个共享检查器 window 其内容会根据处于活动状态的文档而变化。
检查器window控制器是一个共享单例,根据需要从故事板实例化。
文档 class 只是从故事板创建其主要 window,并成为 window 的委托:
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)
}
每当文档的主 window 激活时,它会将检查器的 window 控制器添加到它自己的:
extension Document: NSWindowDelegate {
func windowDidBecomeMain(_ notification: Notification) {
self.addWindowController(InspectorWindowController.shared)
}
}
(这也会更新 window 控制器的 document
属性)
预料到最后一个文档被关闭的情况,我还补充了:
func windowWillClose(_ notification: Notification) {
self.removeWindowController(InspectorWindowController.shared)
}
(只有最后一个文档才需要,否则新的活动文档将接管并且 window 控制器在添加到新的文档后会自动从关闭文档中删除激活文件)
Inspector 本身覆盖 属性 document
和方法 windowTitle(forDocumentDisplayName:)
,以便跟上活动文档:
class InspectorWindowController 覆盖 var 文档:AnyObject? { didSet { //(更新视图控制器的内容) } }
override func windowTitle(forDocumentDisplayName displayName: String) -> String {
if document == nil {
return "Inspector - No Active Document"
} else {
return "Inspector - \(displayName)"
}
}
问题 是,当我关闭最后打开的文档 window 时,检查器的 window 标题停留在为最后一个文件。即当inspectorwindowcontroller的document
属性设置为nil
时,不会调用windowTitle(forDocumentDisplayName:)
。
即使调用 synchronizeWindowTitleWithDocumentName()
也无济于事,因为文档明确提到:
Does nothing if the window controller has no associated document or loaded window. This method queries the window controller’s document to get the document’s display name and full filename path, then calls windowTitle(forDocumentDisplayName:) to get the display name to show in the window title.
(强调我的)
我可以将 Inspector 的内容重置为 "No document" 状态;我怎样才能对 window 标题做同样的事情?
好的,我找到了(愚蠢而明显的)答案:
override var document: AnyObject? {
didSet {
// (Update view controller's contents, etc...)
if document == nil {
self.window?.title = "Inspector - No Active Document"
}
}
}
我不确定这是否是处理它的正确方法,但它确实完成了工作。
我会接受任何更好的答案。