更新: 我已經取得了一些進步的主要窗口保存和恢復。在MainWindowController我已經加入
window?.isRestorable = true
window?.restorationClass = AppDelegate.self
和
override func encodeRestorableState(with coder: NSCoder) {
super.encodeRestorableState(with: coder)
log.pp(tag: logTag, content: #function + "Encoding")
coder.encode(testValue, forKey: "testValue")
}
override func restoreState(with coder: NSCoder) {
super.restoreState(with: coder)
testValue = (coder.decodeObject(forKey: "testValue") as? String)!
log.pp(tag: logTag, content: #function + "value of restored testValue is \(testValue)")
}
在AppDelegate中我有
class func restoreWindow(withIdentifier: String,
state: NSCoder,
completionHandler: @escaping(NSWindow?, Error?) -> Void) -> Void {
print("\n" + #function + " identifier: \(withIdentifier), state: \(state)")
if let mainWindow = NSApplication.shared().mainWindow {
completionHandler(mainWindow, nil)
print("\n" + #function + "completionhandler reinstated main window: \(mainWindow) identifier \(withIdentifier)")
}
else {
completionHandler(nil, nil)
print("\n" + #function + "completionhandler failed to reinstate main window error")
}
}
的主視圖控制器包含
// Saving and Restoration of State
override func encodeRestorableState(with coder: NSCoder) {
super.encodeRestorableState(with: coder)
log.pp(tag: idTag, content: #function + "Encoding state")
coder.encode(testValue, forKey: "MVCStateTest")
}
override func restoreState(with coder: NSCoder) {
super.restoreState(with: coder)
if let string = coder.decodeObject(forKey: "MVCStateTest") as? String! {
log.pp(tag: idTag, content: #function + "value of restored testValue is \(testValue)")
testValue = string
}
}
這一切都似乎工作除了對應的視圖沒有恢復(即可見)。
Mac的應用程序嚮導說,
可可使用返回的窗口進行恢復和保存任何響應者對象到之前的狀態。 - StandardCocoa窗口和視圖對象恢復到以前的狀態,沒有額外的幫助。如果您繼承NSWIndow或NSView,請實施restoreState WIthCoder:方法以恢復任何自定義狀態。
這就是沒有發生。主視圖控制器包含一組由用戶單擊工具欄項目添加的tabViewController。這些TabViewController具有必需的編碼和恢復方法,但不會被調用。
已經在互聯網上尋找指導,但是這樣的幫助存在於所有基於IOS的平臺上,並且不能直接轉換成MacOS。誰能幫忙?
Thx爲迴應。我找到了文檔。大書呆子牧場的例子在Objective C中,我沒有足夠的熟悉翻譯Swift。我認爲,如果我可以計算出'restoreWindow(withIdentifier:String,state NSCoder,completionHandler:@escaping(NSWindow ?, Error?) - > Void) - > Void'class function需要什麼,我會忍受一次戰鬥機會獲得它的工作。 - 另外,我發現令人驚訝和沮喪的是,MacOS上基於Swift的資源非常少。 –
@LesOrmonde https://github.com/kfix/MacPin/blob/a81d77438b57932466c7461700b0d4629ea74d/modules/MacPin/OSX/AppDelegateOSX.swift#L373怎麼樣? –