我正在为 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'slabel和image属性。最后,我必须NSViewControllerRepresentable将我的数组传递NSTabViewItem给NSTabViewController. 除了以下问题外,这一切都很好。
按照设计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