我考虑了 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。 我使用 Preferences 和 TupleView 来实现这一点。
目前尚未解决的一件事是如何处理群组。
这里是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/