簡體   English   中英

在 SwiftUI 中構建自定義的類 TabView 視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM