Как реализовать NSWindowRestoration в Swift?

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

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

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
  }
}

Заранее спасибо!


person Frank Dellaert    schedule 10.06.2014    source источник
comment
Из любопытства, что произойдет, если вы поменяете порядок super.windowDidLoad() и установите window.restorationClass.   -  person Erik    schedule 10.06.2014
comment
Извините, долгое путешествие. Только что попробовал, но разницы нет...   -  person Frank Dellaert    schedule 20.06.2014
comment
Когда я использую self.dynamicType и удостоверяюсь, что мои системные настройки настроены на восстановление окон, вызывается restoreWindowWithIdentifier в моем классе.   -  person Bjorn    schedule 13.01.2015


Ответы (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.

Кроме того, имейте в виду, что параметр восстановления окна теперь по умолчанию отключен по какой-то глупой причине.

person DarkDust    schedule 28.06.2017