开发者社区 问答 正文

SwiftUI,索引ViewBuilder的结果

我正在尝试使用与相似的功能来实现自定义视图TabView。我正在使用初始化显示的标签ViewBuilder。但是,这意味着当我将多个视图传递给初始化程序时,内容为TupleView。如何一次只显示其中一个视图?

struct TabbedView<Content> : View where Content : View {
    @State var selected:Int = 0
    var content:Content

    var body: some View {
        content
    }

    init(@ViewBuilder _ content:() -> Content) {
        self.content = content()
    }
}

struct TestView: View {
    var body: some View {
        TabbedView {
            Text("A")
            Text("B")
        }
    }
}

展开
收起
几许相思几点泪 2019-12-10 19:26:31 672 分享 版权
阿里云 AI 助理回答

在 SwiftUI 中,要实现这样的 TabView 功能,你需要根据选中的标签(selected)来显示对应的内容视图。你可以通过使用 ForEach 遍历内容并根据当前选中的索引来决定显示哪个视图。这里是一个修改后的示例代码:

struct TabbedView<Content: View>: View {
    @State var selected: Int = 0
    @ViewBuilder var content: () -> [Content]

    var body: some View {
        ForEach(0 ..< content().count, id: \.self) { index in
            self.content()[index]
                .opacity(index == self.selected ? 1 : 0)
                .onTapGesture {
                    self.selected = index
                }
        }
    }
}

struct TestView: View {
    var body: some View {
        TabbedView {
            Text("A")
            Text("B")
        }
    }
}

在这个版本中,我做了以下更改:

  1. content 属性更改为一个闭包,它返回一个视图数组 [Content],这允许你传递多个视图。
  2. 使用 ForEach 来遍历这些视图,并根据 selected 状态的值来控制每个视图的可见性(通过设置 .opacity)。
  3. 添加了 .onTapGesture 以便当用户点击任一视图时更新 selected 状态,从而切换到相应的视图。

这样,每次只有一个视图会完全可见(不透明度为1),实现了你想要的标签页效果。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: