在 SwiftUI 中,如何将选项卡放在视图顶部的 TabbedView 中?

In SwiftUI how do I put the tabs in a TabbedView at the top of the view?

提问人:J. Edgell 提问时间:6/7/2019 最后编辑:brunoJ. Edgell 更新时间:5/20/2021 访问量:9198

问:

我有一个底部有选项卡的视图,其中一个有,为了直观地分离逻辑,我用以下代码将子视图的选项卡放在视图的顶部,它工作得很好:viewssubviews

self.tabbar.frame = CGRect( x: 0,
                            y: view.safeAreaInsets.top,
                            width: self.view.frame.size.width,
                            height: 50)

我该怎么做?SwiftUI

视图 选项 卡式 SWIFTUI的

评论


答:

15赞 Fogmeister 6/12/2019 #1

为此,您可以将选项卡视图创建为各个选项卡的容器,如下所示...

struct TabbedView: View {

    @State private var selectedTab: Int = 0

    var body: some View {
        VStack {
            Picker("", selection: $selectedTab) {
                Text("First").tag(0)
                Text("Second").tag(1)
                Text("Third").tag(2)
            }
            .pickerStyle(SegmentedPickerStyle())

            switch(selectedTab) {
                case 0: FirstTabView()
                case 1: SecondTabView()
                case 2: ThirdTabView()
            }
        }
    }
}

这样做时,您将根据分段控件的值有条件地填充“选项卡页”。

通过使用 和 分段控件将更新 selectedTab 值,然后重新呈现视图,该视图将基于 的新值 替换页面。@State$selectedTabselectedTab

编辑

开关现在可以在 SwiftUI 测试版中使用。👍🏻

评论

2赞 Steve Riggins 6/14/2019
不幸的是,至少在 b1 中,我们不能在 ViewBuilders 中使用 switch。Closure containing control flow statement cannot be used with function builder 'ViewBuilder'
0赞 Fogmeister 6/14/2019
@SteveRiggins谢谢,这很痛苦。不过现在更新了我的答案。谢谢
0赞 Matteo Pacini 6/14/2019
块内的控制流语句不是“常规的”——它们由编译器通过结构体进行转换,从而启用强大的 SwiftUI DSL。 不起作用,因为它不是函数构建器提案的一部分。@ViewBuilder@_functionBuilderswitch
2赞 Nico Cobelo 2/12/2021
@Fogmeister,你从哪里得到SegmentedControl?
0赞 kwiknik 2/17/2023
@NicoCobelo 也许来自 UISegmentedControl“由多个段组成的水平控件,每个段都充当离散按钮。”