SwiftUI несколько поповеров в списке - PullRequest
0 голосов
/ 15 марта 2020

Я определил 2 всплывающих окна и один лист в представлении Line().
При использовании этого представления в 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() }
    }
  }
}

1 Ответ

0 голосов
/ 15 марта 2020

Только не используйте Button для .sheet. List обнаруживает кнопки в строке и активирует всю строку (не уверен насчет ошибки, пусть она будет , как было задумано ). Поэтому использование только и везде жестов подэлементов делает ваш код работоспособным.

Протестировано с Xcode 11.2 / iOS 13.2

  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)

      Text("Sheet2")                             // << here !!!
      .onTapGesture {self.showSheet2 = true}     // << here !!!
      .sheet(isPresented: self.$showSheet2, content: { Sheet2()})
    }
  }
...