如何从可恢复的NSWindow中排除某些AppKit视图?

问题描述 投票:1回答:1

可以将[NSWindows设置为restorable,以便在应用程序启动之间保留其配置。

https://developer.apple.com/documentation/appkit/nswindow/1526255-restorable

Windows应该在启动周期之间保留,以保持用户的界面连续性。在随后的启动周期中,系统尝试重新创建窗口并将其配置恢复到保留状态。配置数据将根据需要进行更新,并由系统自动保存。

在新的macOS项目中,情节提要板上的NSWindow默认为restorable

Restorable checkbox in Xcode


我的问题是在NSWindow中嵌入NSTabViewController时出现的。

NSTabViewController

NSTabView正在自动继承窗口的restorable状态,没有添加任何代码。

这使得selected tab在应用程序启动之间持续存在。我不要我希望它始终默认为索引0。如果还原了所选的选项卡,则尝试以编程方式在viewDidLoad中选择一个选项卡会产生意外的结果。


如何强制某些AppKit UI元素从NSWindow状态恢复中排除?

我希望选项卡视图不可恢复。

但是我希望保留其他可恢复的好处,例如恢复先前设置的窗口大小。

如何从NSWindow状态恢复中排除单个视图?

macos storyboard nswindow appkit nstabviewcontroller
1个回答
0
投票

AFAIK,您不能将用户界面的特定部分排除在可恢复范围之外。对于所有元素而言,这都是开或关的事情。这就是为什么我很少使用Apple自己的可恢复性API的原因,因为它们经常不可靠。我总是亲自进行修复,以获得所需的精细控制。但是,对于更简单的窗口,我让系统进行还原。

在此序言之后,为了真正回答您的问题,我很少使用viewDidLoad()来设置任何窗口,因为您发现这会带来一些令人讨厌的后果(例如,该窗口可能还不存在!)。我总是在viewWillAppear()中这样做。为此,您需要设置以下内容:

  1. 您需要在父级tabViewController中将一个ivar(将其命名为NSTabViewController)到您的NSViewController实例(将其命名为NSViewMainController)[]]

  2. 在NSViewMainController中覆盖prepare(for segue: NSStoryboardSegue, sender: Any?)并像这样设置NSTabViewController及其NSViewController子代:

  3. 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
             }
          }
       }
    }
    
  4. 覆盖NSViewMainController的viewWillAppear(),然后设置所需的tabView:

  5. guard let controller = tabViewController else { return }
    controller.selectedTabViewItemIndex = 0
    

    主要警告:但是要当心viewWillAppear()...与viewDidLoad()不同,可以多次调用此重写,因此您需要在代码中考虑这一点并做出适当的反应。

© www.soinside.com 2019 - 2024. All rights reserved.