[英]Building a custom TabView-like view in SwiftUI
我一直在嘗試為 macOS 構建一個工具欄-tabview 組件,該組件可以與子視圖組成,就像下面的 TabView 一樣:
struct ContentView: View {
var body: some View {
TabView {
Text("First View")
.tabItem {
Image(name: "NSUserAccounts")
Text("First")
}.tag(0)
Text("Second View")
.tabItem {
Image(name: "NSUserAccounts")
Text("Second")
}.tag(1)
}
}
}
目前我有這樣的事情:
struct ToolbarTabView<Content>: NSViewControllerRepresentable where Content: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
func makeNSViewController(context: NSViewControllerRepresentableContext<ToolbarTabView>) -> NSTabViewController {
let vc = NSTabViewController()
vc.tabStyle = .toolbar
for item in self.content() as! something? {
let t = NSTabViewItem(viewController: NSHostingController(rootView: item))
t.image = item.image
t.label = item.label
t.identifier = item.identifier
vc.addTabViewItem(t)
}
return vc
}
func updateNSViewController(_ nsViewController: NSTabViewController, context: NSViewControllerRepresentableContext<ToolbarTabView>) {
}
typealias NSViewControllerType = NSTabViewController
}
SwiftUI 是否有可能發生這樣的事情? TabView 內容如何被投射並用於獲取 Image 和 Label 信息?
除了將內容傳遞給您的 ToolbarTabView,您還可以讓它接受一個還包含其他值的數組。 嘗試這樣的事情:
struct ToolbarTabView<Content>: NSViewControllerRepresentable where Content: View {
let tabs: [(imageName: String, label: String, identifier: Int, content: () -> Content)]
init(tabs: [(imageName: String, label: String, identifier: Int, content: () -> Content)]) {
self.tabs = tabs
}
func makeNSViewController(context: NSViewControllerRepresentableContext<ToolbarTabView>) -> NSTabViewController {
let vc = NSTabViewController()
vc.tabStyle = .toolbar
for item in tabs {
let t = NSTabViewItem(viewController: NSHostingController(rootView: item.content()))
//t.image = item.image
t.label = item.label
t.identifier = item.identifier // this causes an "unrecognized selector" error, but maybe I'm passing a bad value for this, I'm not sure what it expects
vc.addTabViewItem(t)
}
return vc
}
func updateNSViewController(_ nsViewController: NSTabViewController, context: NSViewControllerRepresentableContext<ToolbarTabView>) {
}
typealias NSViewControllerType = NSTabViewController
}
struct ToolbarTabView_Previews: PreviewProvider {
static var previews: some View {
ToolbarTabView(tabs: [
(
imageName: "My Image",
label: "tab1",
identifier: 0,
content: {
Text("testing")
}
)
])
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.