可以将[NSWindows设置为restorable
,以便在应用程序启动之间保留其配置。
https://developer.apple.com/documentation/appkit/nswindow/1526255-restorable
Windows应该在启动周期之间保留,以保持用户的界面连续性。在随后的启动周期中,系统尝试重新创建窗口并将其配置恢复到保留状态。配置数据将根据需要进行更新,并由系统自动保存。
在新的macOS项目中,情节提要板上的NSWindow默认为restorable
:
我的问题是在NSWindow中嵌入NSTabViewController时出现的。
NSTabView正在自动继承窗口的restorable
状态,没有添加任何代码。
这使得selected tab在应用程序启动之间持续存在。我不要我希望它始终默认为索引0。如果还原了所选的选项卡,则尝试以编程方式在viewDidLoad
中选择一个选项卡会产生意外的结果。
我希望选项卡视图不可恢复。
但是我将希望保留其他可恢复的好处,例如恢复先前设置的窗口大小。
如何从NSWindow状态恢复中排除单个视图?
AFAIK,您不能将用户界面的特定部分排除在可恢复范围之外。对于所有元素而言,这都是开或关的事情。这就是为什么我很少使用Apple自己的可恢复性API的原因,因为它们经常不可靠。我总是亲自进行修复,以获得所需的精细控制。但是,对于更简单的窗口,我让系统进行还原。
在此序言之后,为了真正回答您的问题,我很少使用viewDidLoad()
来设置任何窗口,因为您发现这会带来一些令人讨厌的后果(例如,该窗口可能还不存在!)。我总是在viewWillAppear()
中这样做。为此,您需要设置以下内容:
您需要在父级tabViewController
中将一个ivar(将其命名为NSTabViewController
)到您的NSViewController
实例(将其命名为NSViewMainController)[]]
在NSViewMainController中覆盖prepare(for segue: NSStoryboardSegue, sender: Any?)
并像这样设置NSTabViewController及其NSViewController
子代:
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
// set up the tabViewController ivar
self.tabViewController = segue.destinationController as? NSTabViewController
// set up the child NSViewControllers if you need to access them via their parent (otherwise this step is not needed)
if let childControllers = tabViewController?.children {
for controller in childControllers {
if let controller = controller as? NSViewController1 {
childController1 = controller
}
else if let controller = controller as? NSViewController2 {
childController2 = controller
}
else if let controller = controller as? NSViewController3 {
childController3 = controller
}
}
}
}
覆盖NSViewMainController的viewWillAppear(),然后设置所需的tabView:
guard let controller = tabViewController else { return }
controller.selectedTabViewItemIndex = 0
主要警告:但是要当心viewWillAppear()...与viewDidLoad()不同,可以多次调用此重写,因此您需要在代码中考虑这一点并做出适当的反应。