【问题标题】:How to disable lazy loading in NSTabViewController?如何在 NSTabViewController 中禁用延迟加载?
【发布时间】:2020-07-12 03:26:17
【问题描述】:

我正在为 NSTabViewController 设计一个带有工具栏样式的 SwiftUI 包装器。我希望它成为 TabView 的替代品。 TabView 使用修饰符tabItem(_:) 来指定选项卡名称和图标。于是我为自己的ToolbarTabView设计了一个类似的修饰符:

extension View {
    func toolbarTabItem(_ label: LocalizedStringKey, nsImage: NSImage? = nil, tooltip: LocalizedStringKey? = nil) -> some View {
        self.preference(key: ToolbarTabItemPreferenceKey.self, value: ToolbarTabItemPreference(label: label, nsImage: nsImage, tooltip: tooltip))
    }
}

我将每个View 包装在NSHostingController 中并创建一个NSTabViewItem。然后我使用onPreferenceChange 设置NSTabViewItemlabelimage 属性。最后,我有一个NSViewControllerRepresentable 将我的NSTabViewItem 数组传递给NSTabViewController。除了以下问题之外,这一切都很好。

按照设计NSTabViewController 只会加载它的第一个标签。这会加载第一个NSHostingController,它会显示第一个View。这会调用onPreferenceChange 并为第一个选项卡设置label。但是,未加载其余选项卡,因此 label 仍未设置。

我知道我可以重新设计我的 API 以显式传递标签和图像并且这很有效,但是 Apple 如何实现他们的 TabView?由于TabView 的 macOS 实现看起来像 NSTabViewController,因此它们必须有相同的视图延迟加载问题。

我认为一种解决方法是强制加载所有选项卡,这是这个问题的标题,但我也愿意接受其他想法。

参考:

https://github.com/utmapp/UTM/blob/dev/Platform/macOS/ToolbarTabView.swift

https://github.com/utmapp/UTM/blob/dev/Platform/macOS/ToolbarTabViewController.swift

【问题讨论】:

    标签: swift macos swiftui appkit nstabviewcontroller


    【解决方案1】:

    这是我想出的愚蠢的解决方法

    public class UTMTabViewController: NSTabViewController {
        public override func viewDidAppear() {
            super.viewDidAppear()
            for i in self.tabViewItems.indices {
                self.selectedTabViewItemIndex = i
            }
            self.selectedTabViewItemIndex = 0
        }
    }
    

    基本上,一旦视图出现,我就会强制加载每个选项卡。我真的希望有比这更好的答案,但我会留在这里以防万一。

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2015-01-11
      • 1970-01-01
      相关资源
      最近更新 更多