swift macos nstextfield nsviewcontroller state-restoration

swift - Interfaz de usuario NSViewController Restauración de estado



macos nstextfield (1)

Para lograr el efecto mencionado, vamos a crear NSSearchField y una clase personalizada llamada RestoredWindow contiene solo una propiedad:

import Cocoa class RestoredWindow: NSWindow { override class var restorableStateKeyPaths: [String] { return ["self.contentViewController.searchField.stringValue"] } }

Asigne esta clase personalizada a Window Controller en Identity Inspector.

A continuación, searchField.stringValue propiedad searchField.stringValue a ViewController en la sección Value del inspector de enlaces.

import Cocoa class ViewController: NSViewController { @IBOutlet weak var searchField: NSSearchField! override func viewDidLoad() { super.viewDidLoad() } }

Después de esto, asegúrese de que no haya marcado Close windows when quitting an app opción de Close windows when quitting an app en la pestaña System Preferences -> General .

Ahora, el texto ingresado en NSSearchField restauró después de salir y volver a iniciar la aplicación.

PD

He intentado lo mismo que tú, pero también fallé. Este enfoque no funciona para mí:

override func encodeRestorableState(with coder: NSCoder) { coder.encode(searchField.stringValue, forKey: "restore") super.encodeRestorableState(with: coder) } override func restoreState(with coder: NSCoder) { if let state = coder.decodeObject(forKey: "restore") as? NSSearchField { searchField.stringValue = state } super.restoreState(with: coder) }

Resumen:

¿Cuál es la forma correcta de guardar / restaurar el estado de un NSSearchField en mi NSViewController utilizando el mecanismo de preservación de la interfaz de usuario integrado de Cocoa?

Detalles:

Estoy trabajando en mi primera aplicación macOS y tengo un pequeño problema con la restauración de estado de mi interfaz de usuario. Hasta ahora lo tengo funcionando hasta el punto en que los encodeRestorableState(with:) y restoreState(with:) se llaman en mi subclase NSViewController .

Tengo un NSSearchField en mi controlador de vista y deseo guardar / restaurar el estado del campo de búsqueda, incluido su texto, cualquier selección, la posición del cursor y si actualmente está enfocado o no.

Si utilizo el siguiente código, el texto se guarda y se restaura correctamente:

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

Obviamente puedo agregar más código para guardar / restaurar la selección del campo de búsqueda y la posición del cursor, etc.

Mi pregunta real es: ¿existe una manera mejor, adecuada y más automática de guardar y restaurar el estado del campo de búsqueda? ¿O es necesario que escriba mi propio código para cada atributo del campo de búsqueda que deseo guardar?

Intenté usar:

searchField.encodeRestorableState(with: coder)

y:

searchField.restoreState(with: coder)

en los dos métodos anteriores, pero eso no dio como resultado que apareciera nada en el campo de búsqueda cuando se reinició mi aplicación.

También implementé:

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

donde "searchField" es el nombre de la propiedad de salida NSTextField en mi controlador de vista. Se llama a este método cuando mi aplicación se inicia pero el texto no se restauró en el campo de búsqueda.

Este controlador de vista se crea a partir de un guión gráfico. Se establece el identifier del controlador de vista. El identifier del campo de búsqueda también se establece. Este controlador de vista es un controlador de vista secundario de otro controlador de vista.

He leído la sección Preservación de la interfaz de usuario del documento "El diseño de la aplicación principal", pero no está claro cómo se guardan / restauran las vistas de un controlador de vista y qué parte de esto es automático en comparación con el manual.

Soporta OSX 10.12 y 10.11. Objective-C o Swift en cualquier respuesta está bien.