SwiftUI列表中的多个弹出窗口

问题描述 投票:0回答:1

我在视图Line()中定义了2个弹出框和1个工作表。在VStack中使用此视图,一切正常。在列表中使用它时,点击相应的文本或按钮时,将显示错误的弹出框/工作表。这是怎么了

struct ContentView: View {
  var body: some View {
    VStack {
      Line()
      List {
        Line()
        Line()
        Line()
      }
    }
  }
}

struct Line: View {
  @State private var showPopup1 = false
  @State private var showPopup2 = false
  @State private var showSheet2 = false

  var body: some View {
    VStack {
      Text("popover 1")
      .onTapGesture { self.showPopup1 = true}
      .popover(isPresented: $showPopup1, arrowEdge: .trailing )
      { Popover1(showSheet: self.$showPopup1) }
      .background(Color.red)

      Text("popover 2")
      .onTapGesture { self.showPopup2 = true }
      .popover(isPresented: $showPopup2, arrowEdge: .trailing )
      { Popover2(showSheet: self.$showPopup2) }
      .background(Color.yellow)

      Button("Sheet2"){self.showSheet2 = true}
      .sheet(isPresented: self.$showSheet2, content: { Sheet2()})
    }
  }
}

struct Popover1: View {
  @Binding var showSheet: Bool

  var body: some View {
    VStack {
      Text("Poppver 1 \(self.showSheet ? "T" : "F")")
      Button("Cancel"){ self.showSheet = false }
    }
  }
}

struct Popover2: View {
  @Binding var showSheet: Bool

  var body: some View {
    VStack {
      Text("Poppver 2")
      Button("Cancel"){ self.showSheet = false }
    }
  }
}

struct Sheet2: View {
  @Environment(\.presentationMode) var presentation

  var body: some View {
    VStack {
      Text("Sheet 2")
      Button("Cancel"){ self.presentation.wrappedValue.dismiss() }
    }
  }
}

swiftui popover
1个回答
0
投票

[List试图重用行视图,因此它可能会错误地将它们解释为相等,因此尝试像下面(或类似内容)一样明确区分它们。

  List {
    Line().id(1)
    Line().id(2)
    Line().id(3)
  }
© www.soinside.com 2019 - 2024. All rights reserved.