如何禁用NSTabViewController中的延迟加载?

时间:2020-07-12 03:26:17

标签: swift macos swiftui appkit nstabviewcontroller

我正在使用工具栏样式为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来设置NSTabViewItem的{​​{1}}和label属性。最后,我有一个image将我的NSViewControllerRepresentable数组传递给NSTabViewItem。除以下问题外,所有其他方法都很好。

根据设计NSTabViewController仅加载其第一个标签。这将加载第一个NSTabViewController,该布局将布置第一个NSHostingController。调用View并为第一个标签设置onPreferenceChange。但是,其余的标签不会被加载,因此label仍未设置。

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

我认为一种解决方法是强制加载所有选项卡,这是此问题的标题,但我也欢迎其他想法。

参考:

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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