我正在为 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