Подтвердить что ты не робот

Восстановление состояния пользовательского интерфейса NSViewController

Резюме:

Каков правильный способ сохранения/восстановления состояния NSSearchField в моем NSViewController с использованием механизма сохранения встроенного пользовательского интерфейса Cocoa?

Детали:

Я работаю над своим первым приложением macOS, и у меня возникают небольшие проблемы с восстановлением состояния для моего пользовательского интерфейса. Пока что я работаю до такой степени, что методы encodeRestorableState(with:) и restoreState(with:) вызываются в моем подклассе NSViewController.

У меня есть NSSearchField в моем контроллере view, и я хочу сохранить/восстановить состояние поля поиска, включая его текст, любой выбор, положение курсора и то, находится ли он в настоящее время в фокусе или нет.

Если я использую следующий код, текст будет правильно сохранен и восстановлен:

override func encodeRestorableState(with coder: NSCoder) {
    super.encodeRestorableState(with: coder)

    coder.encode(searchField.stringValue, forKey: "searchText")
}

override func restoreState(with coder: NSCoder) {
    super.restoreState(with: coder)

    if let searchText = coder.decodeObject(forKey: "searchText") as? String {
        searchField.stringValue = searchText
    }
}

Очевидно, что я могу добавить еще код для сохранения/восстановления выбора поля поиска и положения курсора и т.д.

Мой настоящий вопрос: есть ли лучший, правильный, более автоматический способ сохранения и восстановления состояния поля поиска? Или требуется, чтобы я написал свой собственный код для каждого атрибута поля поиска, который я хочу сохранить?

Я попытался использовать:

searchField.encodeRestorableState(with: coder)

и

searchField.restoreState(with: coder)

в двух вышеуказанных методах, но это не привело к появлению чего-либо в поле поиска, когда мое приложение было перезапущено.

Я также реализовал:

override class func restorableStateKeyPaths() -> [String] {
    var keys = super.restorableStateKeyPaths()
    keys.append("searchField.stringValue")

    return keys
}

где "searchField" - это имя свойства NSTextField outlet в моем контроллере представления. Этот метод вызывается, когда мое приложение запущено, но текст не был восстановлен в поле поиска.

Этот контроллер представлений создается из раскадровки. Установлен контроллер вида identifier. Поле поиска identifier также задано. Этот контроллер представления является контроллером детского представления другого контроллера представления.

Я прочитал раздел Сохранение пользовательского интерфейса в документе "Core App Design", но неясно, как сохраняются/восстанавливаются представления контроллера просмотра насколько это автоматическое и ручное.

Поддержка OSX 10.12 и 10.11. Objective-C или Swift в любых ответах хорошо.

4b9b3361