2014-06-10 7 views
3

Я попытался реализовать протокол NSWindowRestoration в Swift в приложении, не основанном на документах. Однако метод restoreWindowWithIdentifier никогда не вызывается при запуске приложения. Может ли кто-нибудь указать на мою ошибку?Как реализовать NSWindowRestoration в Swift?

Вот подмножество кода (который компилируется и работает нормально):

class AppDelegate: NSObject, NSApplicationDelegate, NSWindowRestoration { 

    var windowController : MyWindowController? 

    func applicationDidFinishLaunching(aNotification: NSNotification?) { 
    windowController = MyWindowController(windowNibName:"ImageSequenceView") 
    } 

    class func restoreWindowWithIdentifier(identifier: String!, state: NSCoder!, completionHandler: ((NSWindow!,NSError!) -> Void)!) { 
    NSLog("restoreWindowWithIdentifier: \(identifier), state: \(state)") 
    } 

} 

class MyWindowController: NSWindowController { 

    override func windowDidLoad() { 
    super.windowDidLoad(); 
    window.restorationClass = AppDelegate.self 
    } 
} 

Спасибо заранее!

+0

Из любопытства, что происходит, когда вы меняете порядок 'super.windowDidLoad()' и устанавливаете 'window.restorationClass'. – Erik

+0

Извините, долгое путешествие. Просто попробовал, но не имеет значения ... –

+0

Когда я использую 'self.dynamicType' и удостоверяюсь, что мои системные настройки настроены на восстановление Windows' restoreWindowWithIdentifier' на мой класс. –

ответ

1

Вы должны установить класс реставрации и также идентификатор:

class MyWindowController: NSWindowController { 
    override func windowDidLoad() { 
     super.windowDidLoad() 

     self.window?.restorationClass = type(of: self) 
     self.window?.identifier = "MyWindow" 
    } 
} 

extension MyWindowController: NSWindowRestoration { 
    static func restoreWindow(withIdentifier identifier: String, state: NSCoder, completionHandler: @escaping (NSWindow?, Error?) -> Void) { 
     if identifier == "MyWindow" { 
      // Restore the window here 
     } 
    } 
} 

Конечно, вы можете также позволить другой класс восстановить окно, как вы пытались. В этом случае вам необходимо назначить AppDelegate.self как restorationClass.

Кроме того, имейте в виду, что window restoration setting now defaults to "off" по любой глупой причине.

+0

Это работает для меня. Должен быть принятый ответ. – Klaas