2017-05-04 188 views
0

任何人都可以指向描述MacOS上狀態保存和恢復的資源。我一直無法找到任何詳細的非IOS資源(指南,示例代碼等)。我確實在核心應用程序設計https://developer.apple.com/library/content/documentation/General/Conceptual/MOSXAppProgrammingGuide/CoreAppDesign/CoreAppDesign.html#//apple_ref/doc/uid/TP40010543-CH3-SW26以及此視頻https://developer.apple.com/videos/play/wwdc2016/239/?time=2273中找到了一些段落,但它們沒有提供完整的圖片。我正在使用Swift 3,XCode 8.2.1和Macos 10.11.6在MacOs上保存和恢復狀態

任何幫助非常感謝。

回答

0
+0

Thx爲迴應。我找到了文檔。大書呆子牧場的例子在Objective C中,我沒有足夠的熟悉翻譯Swift。我認爲,如果我可以計算出'restoreWindow(withIdentifier:String,state NSCoder,completionHandler:@escaping(NSWindow ?, Error?) - > Void) - > Void'class function需要什麼,我會忍受一次戰鬥機會獲得它的工作。 - 另外,我發現令人驚訝和沮喪的是,MacOS上基於Swift的資源非常少。 –

+0

@LesOrmonde https://github.com/kfix/MacPin/blob/a81d77438b57932466c7461700b0d4629ea74d/modules/MacPin/OSX/AppDelegateOSX.swift#L373怎麼樣? –

0

更新: 我已經取得了一些進步的主要窗口保存和恢復。在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。誰能幫忙?

相關問題