gpt4 book ai didi

macos - 如何从可恢复的 NSWindow 中排除某些 AppKit View ?

转载 作者:行者123 更新时间:2023-12-03 19:14:25 25 4
gpt4 key购买 nike

NSWindows 可以制作 restorable以便在应用程序启动之间保留它们的配置。

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

Windows should be preserved between launch cycles to maintain interface continuity for the user. During subsequent launch cycles, the system tries to recreate the window and restore its configuration to the preserved state. Configuration data is updated as needed and saved automatically by the system.


在一个新的 macOS 项目中,Storyboard 上的 NSWindow 是 restorable默认情况下:
Restorable checkbox in Xcode

我的问题是在 NSWindow 中嵌入 NSTabViewController 时出现的。
NSTabViewController
NSTabView 正在继承窗口的 restorable自动状态,无需添加代码。
这使得 所选标签 在应用程序启动之间坚持。我不想要那个。我希望它始终默认为索引 0。如果所选选项卡已恢复,则尝试在 viewDidLoad 中以编程方式选择一个选项卡有意想不到的结果。

如何强制从 NSWindow 状态恢复中排除某些 AppKit UI 元素?
我希望选项卡 View 不可恢复。
但我想保留其他可恢复的好处,例如恢复先前设置的窗口大小。
如何从 NSWindow 状态恢复中排除单个 View ?

最佳答案

AFAIK,您不能将 UI 的某个部分排除在可恢复之外。对于所有元素,它都是 ON 或 OFF 的事情。这就是为什么我很少使用 Apple 自己的可恢复性 API,因为它们通常不可靠。我总是自己进行修复,以获得您需要的精细控制。然而,对于更简单的窗口,我让系统进行恢复。

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

  • 您需要有一个 ivar(我们称之为 tabViewController)到您的 NSTabViewController实例在你的 parent NSViewController (我们称之为 NSViewMainController)
  • 覆盖 prepare(for segue: NSStoryboardSegue, sender: Any?)在 NSViewMainController 中设置 NSTabViewController 及其 NSViewController child 是这样的:
    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() 不同,这个覆盖可以被多次调用,因此你需要在你的代码中考虑到这一点并做出适当的 react 。

    关于macos - 如何从可恢复的 NSWindow 中排除某些 AppKit View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61243620/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com