ツールバー スタイルの 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
ますか? の 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