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)

在上述两种方法中,但是当我的应用程序重新启动时,搜索字段中没有出现任何内容。

我还实现了:

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

    return keys
}

我的视图控制器中插座属性"searchField"的名称在哪里。NSTextField当我的应用程序启动但文本未在搜索字段中恢复时调用此方法。

此视图控制器是从情节提要创建的。视图控制器的identifier设置。搜索字段identifier也已设置。这个视图控制器是另一个视图控制器的子视图控制器。

我已通读“核心应用程序设计”文档的用户界面保留部分,但不清楚如何保存/恢复视图控制器的视图,以及其中有多少是自动与手动。

支持 OSX 10.12 和 10.11。任何答案中的 Objective-C 或 Swift 都可以。

4

1 回答 1

2

为了实现上述效果,让我们创建NSSearchField一个名为的自定义类,该类RestoredWindow只包含一个属性:

import Cocoa

class RestoredWindow: NSWindow {

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

将此自定义类分配给 Identity Inspector 中的 Window Controller。

接下来,让我们将searchField.stringValue属性绑定到ViewControllerBindings ValueInspector 部分。

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var searchField: NSSearchField!

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

在此之后,确保您没有Close windows when quitting an appSystem Preferences->选项卡中选中选项General

NSSearchField现在,在退出并再次启动应用程序后恢复输入的文本。

附言

我尝试过和你一样的方法,但也失败了。这种方法对我不起作用:

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)
}
于 2018-05-15T22:14:46.340 回答