rma*_*ddy 33 macos nstextfield nsviewcontroller state-restoration swift
摘要:
使用Cocoa的内置用户界面保存机制保存/恢复NSSearchField我的状态的正确方法是什么NSViewController?
细节:
我正在开发我的第一个macOS应用程序,我的用户界面状态恢复有点麻烦.到目前为止,我已经将它工作到了我的子类中调用encodeRestorableState(with:)和restoreState(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
}
}
Run Code Online (Sandbox Code Playgroud)
显然我可以添加更多代码来保存/恢复搜索字段的选择和光标位置等.
我真正的问题是,是否有更好,更正确,更自动的方式来保存和恢复搜索字段的状态?或者我是否需要为我希望保存的搜索字段的每个属性编写自己的代码?
我试过用:
searchField.encodeRestorableState(with: coder)
Run Code Online (Sandbox Code Playgroud)
和:
searchField.restoreState(with: coder)
Run Code Online (Sandbox Code Playgroud)
在上述两种方法中,但在我的应用重新启动时,搜索字段中没有出现任何内容.
我还实施了:
override class func restorableStateKeyPaths() -> [String] {
var keys = super.restorableStateKeyPaths()
keys.append("searchField.stringValue")
return keys
}
Run Code Online (Sandbox Code Playgroud)
这里"searchField"是名NSTextField在我的视图控制器插座财产.启动我的应用程序但在搜索字段中未恢复文本时会调用此方法.
此视图控制器是从故事板创建的.视图控制器identifier已设置.搜索字段也identifier已设置.此视图控制器是另一个视图控制器的子视图控制器.
我已经阅读了"核心应用程序设计"文档的" 用户界面保留"部分,但是目前还不清楚视图控制器的视图是如何保存/恢复的,有多少是自动与手动的.
支持OSX 10.12和10.11.任何答案中的Objective-C或Swift都可以.
为了实现上述效果,让我们创建NSSearchField一个名为RestoredWindow仅包含一个属性的自定义类:
import Cocoa
class RestoredWindow: NSWindow {
override class var restorableStateKeyPaths: [String] {
return ["self.contentViewController.searchField.stringValue"]
}
}
Run Code Online (Sandbox Code Playgroud)
将此自定义类分配给身份检查器中的窗口控制器。
接下来,让我们将searchField.stringValue属性绑定到绑定检查器ViewController部分Value。
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var searchField: NSSearchField!
override func viewDidLoad() {
super.viewDidLoad()
}
}
Run Code Online (Sandbox Code Playgroud)
之后,确保您没有选中->选项卡
Close windows when quitting an app中的选项。System PreferencesGeneral
现在,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)
}
Run Code Online (Sandbox Code Playgroud)