2

我正在为 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在 a 中NSHostingController并创建一个NSTabViewItem. 然后我onPreferenceChange用来设置NSTabViewItem'slabelimage属性。最后,我必须NSViewControllerRepresentable将我的数组传递NSTabViewItemNSTabViewController. 除了以下问题外,这一切都很好。

按照设计NSTabViewController,只会加载其第一个选项卡。这加载了第NSHostingController一个布局的第一个View。这调用onPreferenceChange并设置了label第一个选项卡。但是,其余选项卡未加载,因此label未设置。

我知道我可以重新设计我的 API 以明确地传递标签和图像并且这很有效,但是 Apple 是如何实现它们的TabView呢?由于 macOS 的实现TabView看起来像NSTabViewController.

我认为一种解决方法是强制加载所有选项卡,这是这个问题的标题,但我也对其他想法持开放态度。

参考:

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

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

4

1 回答 1

0

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

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

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

于 2020-07-12T17:28:00.480 回答