34

概要:

Cocoa の組み込みのユーザー インターフェイス保存メカニズムを使用してNSSearchField、の状態を保存/復元する適切な方法は何ですか?NSViewController

詳細:

初めての macOS アプリに取り組んでいますが、ユーザー インターフェイスの状態の復元に少し問題があります。これまでのところ、サブクラスでencodeRestorableState(with:)andrestoreState(with:)メソッドが呼び出されるところまで機能しています。NSViewController

ビューコントローラーにがNSSearchFieldあり、検索フィールドの状態 (テキスト、選択範囲、カーソル位置、現在フォーカスされているかどうかなど) を保存/復元したいと考えています。

次のコードを使用すると、テキストが適切に保存され、復元されます。

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)

上記の2つの方法では、アプリを再起動したときに検索フィールドに何も表示されませんでした。

私も実装しました:

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

    return keys
}

ここで、View Controller のアウトレット プロパティ"searchField"の名前を指定します。NSTextFieldこのメソッドは、アプリが起動されたときに呼び出されますが、検索フィールドにテキストが復元されませんでした。

このビュー コントローラーは、ストーリーボードから作成されます。ビューコントローラーidentifierが設定されました。検索フィールドidentifierも設定されています。このView Controllerは、別のView Controllerの子View Controllerです。

「The Core App Design」ドキュメントのUser Interface Preservationセクションを読みましたが、View Controller のビューがどのように保存/復元されるか、および自動と手動のどちらがどの程度なのかが明確ではありません。

OSX 10.12 および 10.11 をサポートします。どの回答でもObjective-CまたはSwiftで問題ありません。

4

1 に答える 1