Резюме:
Каков правильный способ сохранения/восстановления состояния 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 в любых ответах хорошо.