Насколько мне известно, это абсолютный минимум, необходимый для реализации пользовательского восстановления состояния пользовательского интерфейса окна и / или его содержимого.
В этом примере у меня есть окно с флажком, и состояние этого флажка представляет собой некоторое пользовательское состояние представления, которое я хочу восстановить при перезапуске приложения.
Проект содержит одно окно с одной кнопкой-флажком. Значение кнопки привязано к свойству myState
контроллера представления содержимого окна. Так что с технической точки зрения тот факт, что это флажок управления не имеет значения; на самом деле мы собираемся сохранить и восстановить свойство myState
(пользовательский интерфейс позаботится о себе).
Для этого свойство restorable
окна имеет значение true
(в инспекторе объектов окна), и окну присваивается идентификатор ("PersistentWindow"
). NSWindow
является подклассом (PersistentWindow
), и подкласс реализует свойство restorableStateKeyPaths
. Это свойство содержит список пользовательских свойств, которые должны быть сохранены / восстановлены.
Примечание: если вы можете определить восстановление состояния пользовательского интерфейса в виде списка путей свойств, соответствующих ключу-значению, это (безусловно) самое простое решение. Если нет, вы должны реализовать encodeRestorableState
/ restoreState
и отвечать за вызов invalidateRestorableState
.
Вот класс пользовательских окон:
class PersistentWindow: NSWindow {
// Custom subclass of window the perserves/restores UI state
// The simple way to preserve and restore state information is to just declare the key-value paths
// of the properties you want preserved/restored; Cocoa does the rest
override class var restorableStateKeyPaths: [String] {
return [ "self.contentViewController.myState" ]
}
// Alternatively, if you have complex UI state, you can implement these methods
// override func encodeRestorableState(with coder: NSCoder) {
// // optional method to encode special/complex view state here
// }
//
// override func restoreState(with coder: NSCoder) {
// // companion method to decode special/complex view state
// }
}
А вот (соответствующая часть) контроллера просмотра контента
class ViewController: NSViewController {
@objc var myState : Bool = false
blah, blah, blah
}
(Я создал его как проект приложения Какао, который я мог бы загрузить, если бы кто-то сказал мне, куда я мог бы загрузить его.)