class NSWindowController : NSResponder
用于管理window的控制器,通常是存儲在nib文件中的window
管理窗口需要:
1)加載/顯示窗口
2)適時關閉窗口
3)定制窗口標題
4)將窗口的frame存儲在默認的數據庫中
5)級聯app中的其他關聯的document window
window controller 可以自己管理window,或者基于AppKit中document框架(包含了NSDocument,NSDocumentController對象)來管理window.在這個架構中, 一個window controller是被NSDocuemnt子類的實例document來創建和管理,并依次保留對document對象的引用。
window controller和nib文件之間的關系非常重要。雖然widnow controller 可以通過編程方式來創建一個window, 但是通常它通過nib文件來創建window。nib文件可以包含一些其他頂級的對象, 包含其他的windows,但是這個window controller的職責是這個主窗口。window controller一般是nib文件的擁有者,即使它是基于document app的一部分。無論誰是nib文件的所有者,window controller負責釋放它加載的nib文件中所有頂級對象。
對于一些簡單的,比如只有一個nib文件,該文件包含一個window,AppKit已經為我們創建了一個NSWindowControllerl,我們可以直接使用。如果默認的window controller不能滿足我們的需求,我們可以子類化NSWindowController。對于有多個window和panel的文檔,我們必須分別每個widnow和panel創建NSWindowController的實例。比如CAD應用具有不同的窗口渲染對象的top, side,和front視圖。你在NSDocument子類中所做的決定了使用默認的NSWindowcontroller還是單獨創建和配置的NSWindowController對象。
子類化 NSWindowController
當我們想要增加一些默認的行為時,我們可以創建一個NSWindowController的子類,比如在window加載之前給window一個定制化的標題或者或者設置一些任務。在類的初始化方法中,一定要在調用super. initWithWindowNibName或者super.init(window:)中的一個。我們選擇的初始化方法取決于window對象是通過nib文件還是編程方式創建。
當然,我們還可以實現NSWindowController子類來避免要求客戶端代碼獲取nib文件名并且當初始化window controller的時候傳遞到init(windowNibName:) 或者 init(windowNibName: owner:)
。最好的方法是重寫windowNibName然后返回nib文件的名稱和通過將nil傳遞給init(window:)來實例化window controller。使用指定的init(window:)初始化簡化了swift初始化要求。
通常,你只需要重寫以下方法即可:
windowWillLoad(): 在nib文件加載前覆蓋以執行任務。
windowDidLoad() : 在nib文件加載后覆蓋以執行任務。
windowTitle(forDucomentDisplayName:) :用以定制window標題。
我們還可以重寫loadWindow()來獲取不同的nib查找 或者nib加載行為,雖然我們通常不需要這么做。
初始化 WindowController
init(window: NSWindow?)
通過指定的widnow實例化一個WindowController.
init(windowNibName: NSNib.name)
通過一個nib文件初始化WindowController
init(widnowNibName: NSNib.name, owner:Any)
通過nib文件和一個指定的nib文件的owner來初始化WindowController
init(windowNibPath: String, owner: Any)
通過nib文件的絕對路徑和owner來實例化WindowController
加載和顯示Window
func loadWindow()
從nib文件中加載receiver's widnow
func showWindow(Any?)
顯示與receiver關聯的window
var isWindowLoaded: Bool
包含reciever‘s widnow的nib文件是否已被加載。
var window: NSWincow?
reciever 擁有的window
訪問該屬性時如果nib文件還未被加載時,會加載該nib文件。
如果widnow已經被加載 windowWillLoad(),loadWindow()和windowDidLoad()方法會被順序調用。
如果windowController有一個document,
這個document的windowControllerWillLoadNib(_:)和windowControllerDidLoadNib(_:)也被調用。
我們也經常重寫這些方法,在這些事情前后來影響nib的加載或者做一些其他事情。
設置此屬性會釋放窗口控制器的舊窗口以及nib文件中的任何關聯的頂級對象,并建立新窗口的所有權。
通常我們不應該使用此屬性來設置窗口。
而是為新窗口創建一個新的窗口控制器,然后釋放舊的窗口控制器。
func windowDidLoad()
func windowWillLoad()
在window 加載前/后調用
關閉Window
func close()
關閉加載完成的widnow
var sholdCloseDocument: Bool
true:當它管理的window關閉時關閉與document的關聯
false:當他管理的window關閉時,不關閉與document的關聯