列表中的 SwiftUI 多个弹出框

Posted

技术标签:

【中文标题】列表中的 SwiftUI 多个弹出框【英文标题】:SwiftUI multiple popovers in a List 【发布时间】:2020-03-15 16:38:21 【问题描述】:

我在视图 Line() 中定义了 2 个弹出框和一张表。 在 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() 
    
  


【问题讨论】:

我可以看看 Popover1 和 Popover2 的代码吗? @user3441734 Popover1 和 Popover2 代码在帖子中# 是的,我现在看到了... 1) 删除除一行之外的所有 Line() 2) 从模拟器调试菜单中选择“显示动画”。 3) 试试看:-)。原因很快就会清楚。是的,我知道,您不会很高兴,但唯一的解决方案是不要在 List 行中使用任何“额外”手势,直到开发人员无法使用 ListStyle。对不起... 是的,至少这不是简单的解决方案。并且看到,在向下滑动时,您可以看到其他模态出现一段时间。不幸的是,几乎没有机会调试它,因为您无权访问 List 内部。我确实使用 ScrollView ......即使有很多想法要实现。 【参考方案1】:

只是不要将Button 用于.sheetList 检测行中的按钮并激活整行(不确定是否存在错误,按设计进行)。因此,在子元素手势中使用 only 和 for 可以让您的代码正常工作。

使用 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())
    
  

【讨论】:

Thnx,但不起作用。在某些情况下,仍然会出现错误的弹出框。如果它可以工作,这不会导致性能问题,如果你有一个列表,例如5000 项?

以上是关于列表中的 SwiftUI 多个弹出框的主要内容,如果未能解决你的问题,请参考以下文章

js弹出框对话框提示框弹窗总结

js弹出框对话框提示框弹窗总结

SwiftUI - ForEach 循环中的弹出框

(转)js弹出框对话框提示框弹窗总结

隐藏弹出框控制器

SwiftUI 弹出框在 NavigationView 中时消失