【发布时间】:2020-07-12 03:26:17
【问题描述】:
我正在为 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 的label 和image 属性。最后,我有一个NSViewControllerRepresentable 将我的NSTabViewItem 数组传递给NSTabViewController。除了以下问题之外,这一切都很好。
按照设计NSTabViewController 只会加载它的第一个标签。这会加载第一个NSHostingController,它会显示第一个View。这会调用onPreferenceChange 并为第一个选项卡设置label。但是,未加载其余选项卡,因此 label 仍未设置。
我知道我可以重新设计我的 API 以显式传递标签和图像并且这很有效,但是 Apple 如何实现他们的 TabView?由于TabView 的 macOS 实现看起来像 NSTabViewController,因此它们必须有相同的视图延迟加载问题。
我认为一种解决方法是强制加载所有选项卡,这是这个问题的标题,但我也愿意接受其他想法。
参考:
https://github.com/utmapp/UTM/blob/dev/Platform/macOS/ToolbarTabView.swift
https://github.com/utmapp/UTM/blob/dev/Platform/macOS/ToolbarTabViewController.swift
【问题讨论】:
标签: swift macos swiftui appkit nstabviewcontroller