如何根据某个标签值返回不同的视图?

时间:2019-07-29 16:58:14

标签: swiftui

我试图从视图对象数组返回.sheet修饰符内的视图。我在获取用于为不同视图设置标签的SwiftUI逻辑时遇到了麻烦。这可能很简单,但是我无法弄清楚。

我已经尝试过if语句和带有switch / case的函数,但是我无法返回特定的视图。我相信,由于我已向对象手动添加了tag,因此一旦满足条件,它在所有按钮中仅返回单个视图(Destination View1)。

这是我的ForEach数组的covers循环:

var covers = coverData

ForEach(covers) { item in
    Button(action: { self.isPresented.toggle() }) {
        CoverAttributes(title: item.title,
                alternativeTitle: alternativeTitle,
                tapForMore: item.tapForMore,
                color: item.color,
                shadowColor: item.shadowColor)
            .sheet(isPresented: self.$isPresented, content: { Text("Destination View1") })

    }
}

数组的结构如下:

let coverData = [
    Cover(title: "Title1",
              alternativeTitle: "Alternative title",
              tapForMore: "Tap to see",
              color: Color("background3"),
              shadowColor: Color("backgroundShadow3"),
              tag: 1)

// Three more items with tags 2, 3, 4)

]

我还希望能够为其他按钮返回其余的Destination View2, 3, and 4

1 个答案:

答案 0 :(得分:0)

我将尝试在循环中使用.sheet声明,否则您将得到很多.sheet“对象”,它们全部由相同的$isPresented触发,并且大多数可能只有第一个会被渲染。

所以,我认为这会起作用:

var covers = coverData
var selectedTag = 0

Group {
   ForEach(covers) { item in
      Button(action: { 
         self.selectedTag = item.tag
         self.isPresented.toggle() 
      }) {
        CoverAttributes(
           title: item.title,
           alternativeTitle: alternativeTitle,
           tapForMore: item.tapForMore,
           color: item.color,
           shadowColor: item.shadowColor)
      }
   }
}
.sheet(isPresented: self.$isPresented, content: { 
    Text("Destination View \(self.selectedTag)") 
    // Here you could use a switch statement on selectedTag if you want
})

这是一个正在工作的操场,上面显示了一个工作示例:

import SwiftUI
import PlaygroundSupport


struct Cover {
    var tag: Int
    var title: String
}

struct ContentView : View {

    @State var isPresented = false
    @State var selectedTag = 0

    var covers = [
        Cover(tag: 1, title: "Cover 1"),
        Cover(tag: 2, title: "Cover 2"),
        Cover(tag: 3, title: "Cover 3")
    ]


    var body: some View {
        Group {
            ForEach(covers, id: \.tag) { item in
                Button(action: {
                    self.selectedTag = item.tag
                    self.isPresented.toggle()
                }) {
                    Text(item.title)
                }
           }
        }
        .sheet(isPresented: self.$isPresented, content: {
            if self.selectedTag == 1 {
                Text("Tag 1")
            } else if self.selectedTag == 2 {
                Text("Tag 2")
            } else {
                Text("Other tag")
            }
        })
    }
}

PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())