SwiftUI TabView的底层实现方式是什么?

4

我考虑了SwiftUI中TabView的实现方式。

据我所见,它仅需要将内容作为@ViewBuilder传递给初始化器。

public init(selection: Binding<SelectionValue>?, @ViewBuilder content: () -> Content)

我希望能实现自己的自定义MyTabView,其使用方式类似于本地TabView。但是考虑到如何将多个视图(屏幕)传递到@ViewBuilder中,并基于此参数,即返回Content的闭包条件性地显示它们!根据选择参数。

是否有一些私有实现或有可能以某种方式实现这一点。原始的TabView有许多限制,我想规避这些限制。但同时,我想坚持使用本地实现。

我希望采用类似以下的方法:

MyTabView(selection: $selection, tabs: { 
    Tab1() 
    Tab2() 
    Tab3() 
}) { 
    View1()
    View2()
    View3() 
}

当然,最好的情况是有像这样的东西。
MyTabView(selection: $selection}) { 
    View1().tabItem({})
    View2().tabItem()
    View3().tabItem() 
}

但是最后一个选项似乎更难实现。

你能再解释一下关于最后一个选项你的意思吗?你想让标签栏的图片和文本被推断吗? - cbjeukendrup
这是SwiftUI使用TabView来定义tabItems的用法。我想在我的自定义MyTabView实现中以类似的方式定义这些选项卡项目。 - Michał Ziobro
1个回答

2

好的,我有一个简单版本,它具有类似TabView的API。我使用了PreferencesTupleView来实现这一点。

目前唯一未解决的问题是如何处理分组。

这是github项目链接: https://github.com/michzio/Click5Menu

这里是一个样例,展示如何使用:

 Click5MenuView {


            Page1()
            Page2()
            Page3()

            NavigationView {
                Text("Page 4")
                    .navigationBarTitle("Page 4", displayMode: .inline)
                    .hamburgerButton()
            }
            .menuItem {
               MenuItemView(systemImage: "person", title: "Page 4")
            }
            .withTag(3)

            NavigationView {
                Text("Page 5")
                .navigationBarTitle("Page 5", displayMode: .inline)
                .hamburgerButton()
            }
            .menuItem {
                MenuItemView(systemImage: "person", title: "Page 5")
            }
            .withTag(4)

}

struct Page1 : View {

    var body: some View {

        NavigationView {
            Text("Page 1")
            .navigationBarTitle("Page 1", displayMode: .inline)
            .hamburgerButton()
        }
        .menuItem {
            MenuItemView(systemImage: "person", title: "Page 1")
        }
        .tabBarItem {
            TabItemView(systemImage: "person", title: "Page 1")
        }
        .withTag(0)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接