/ / UI Save / Restoration mechanizm w kakao przez Swift - szybki, macos, kakao, przywracanie, savestate

Mechanizm UI Save / Restoration w Cocoa poprzez Swift - szybki, macos, kakao, przywracanie, savestate

Chciałbym uratować stan Check Box, zamknij aplikację, a następnie uruchom ponownie aplikację macOS, aby zobaczyć mój przywrócony stan Check Box. Ale nie ma przywróconego stanu w interfejsie użytkownika mojej aplikacji.

Co ja robię źle?

import Cocoa

class ViewController: NSViewController {

@IBOutlet weak var tick: NSButton!

override func viewDidLoad() {
super.viewDidLoad()
}

override func encodeRestorableState(with coder: NSCoder) {
super.encodeRestorableState(with: coder)
coder.encode(tick.state, forKey: "")
}

override func restoreState(with coder: NSCoder) {
super.restoreState(with: coder)
if let state = coder.decodeObject(forKey: "") as? NSControl.StateValue {
tick.state = state
}
}
}

Odpowiedzi:

1 dla odpowiedzi № 1

Zgodnie z moją wiedzą, jest to absolutne minimum potrzebne do zaimplementowania niestandardowego przywracania stanu okna i / lub jego zawartości.

W tym przykładzie mam okno z polem wyboru i ten stan pola wyboru reprezentuje pewien niestandardowy stan widoku, który chcę przywrócić po ponownym uruchomieniu aplikacji.

Projekt zawiera pojedyncze okno z pojedynczym przyciskiem wyboru. Wartość przycisku jest przypisana do myState właściwość kontrolera widoku zawartości okna, więc technicznie fakt, że jest to kontrola pola wyboru, jest nieistotny, tak naprawdę zachowamy i przywracamy myState własność (UI dba o siebie).

Aby to zadziałało, okno "s restorable Właściwość jest ustawiona na true (w oknie Inspektora obiektów okna), a okno ma przypisany identyfikator ("PersistentWindow"). NSWindow jest podklasowany (PersistentWindow) i podklasa implementuje restorableStateKeyPaths własność. Ta właściwość zawiera listę właściwości niestandardowych, które mają zostać zachowane / odtworzone.

Uwaga: jeśli możesz zdefiniować przywracanie stanu interfejsu użytkownika w postaci listy ścieżek właściwości zgodnych z kluczem wartości, to (zdecydowanie) najprostsze rozwiązanie. Jeśli nie, musisz wdrożyć encodeRestorableState / restoreState i są odpowiedzialni za dzwonienie invalidateRestorableState.

Oto niestandardowa klasa okna:

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

}

I tutaj jest (odpowiednia część) kontrolera widoku treści

class ViewController: NSViewController {

@objc var myState : Bool = false

blah, blah, blah
}

(Zbudowałem to jako projekt aplikacji Cocoa, który mogłem przesłać, jeśli ktoś powie mi, gdzie mogę go przesłać.)