SwiftUI下TabView是怎么实现的

标签 swift swiftui tabview

我考虑了 SwiftUI 中的 TabView 是如何实现的。

正如我所看到的,它将带有内容的@ViewBuilder 带入初始化程序。

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

我想实现我自己的自定义 MyTabView,其用法类似于 native TabView 的用法。但是考虑如何将多个 View (屏幕)传递给内容@ViewBuilder,然后基于此参数,即闭包返回内容只是有条件地显示它们!基于选择参数。

是否有一些私有(private)实现或有可能以某种方式实现这一目标。原始 TabView 有许多我想规避的限制。但同时我想坚持使用 native 实现

我想要这样的方法:

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

当然最好是有这样的东西

MyTabView(selection: $selection}) { 
    View1().tabItem({})
    View2().tabItem()
    View3().tabItem() 
}

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

最佳答案

好的,我有一个简单的版本,它具有与 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)
    }
}

关于SwiftUI下TabView是怎么实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028441/

相关文章:

ios - SwiftUI 预览版因 stackoverflow 崩溃

android - 如何在 Android 中保存和恢复 ListView 位置

ios - 无法在 iOS 中使用 Maestro 字体

ios - 如何滑动 1 UITableView 和 UICollectionView

swift - 关于将数组与 State 属性一起使用的问题

ios - 如何在 SwiftUI 中将渐变前景色文本移动到 View 的中心?

css - 样式化 PrimeNG p-tabView

ios - SwiftUI 通过 TabView 以模态方式呈现 View ?

尝试获取设备位置时 iOS 应用程序崩溃 - 线程 1 : EXC_BAD_ACCESS

ios - 单击button1时如何快速更改button2的颜色?