我正在使用工具栏样式为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
答案 0 :(得分:0)
这是我想到的愚蠢的解决方法
public class UTMTabViewController: NSTabViewController {
public override func viewDidAppear() {
super.viewDidAppear()
for i in self.tabViewItems.indices {
self.selectedTabViewItemIndex = i
}
self.selectedTabViewItemIndex = 0
}
}
基本上,一旦视图出现,我就会强制加载每个选项卡。我真的希望有一个比这个更好的答案,但是为了以防万一,我会留在这里。