使用SwiftUI以编程方式关闭弹出窗口

3

我试图通过设置变量使弹出窗口消失,将其显示为false。

示例代码行为相当奇怪。 有没有更好的方法来使用“取消”按钮程序性地关闭弹出窗口?

import SwiftUI

struct ContentView: View {
  let lines = ["line 1", "line 2","line 3"]
  var body: some View {
    List {
      ForEach(lines, id: \.self)
      { Line(text: $0)
      }
    }
  }
}

struct Line: View {
  @State var text: String
  @State var showSheet = false

  var body: some View {
    VStack
    { Text("\(text)")
      .onTapGesture {
        self.showSheet = true
      }
    }.popover( isPresented: self.$showSheet,
               arrowEdge: .trailing
             )
    { Pop(showSheet: self.$showSheet)
    }
  }
}

struct Pop: View {
  @Binding var showSheet: Bool

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

我在iPhone 11模拟器中运行了Xcode版本11.3.1(11C504)的示例代码。在那里,无法点击并多次解除。在实际设备上运行正常 - 可能是模拟器的问题。 - undefined
1个回答

5

由于测试表明,提供的代码在Xcode 11.2/3+和iOS13.2+上运行良好,因此无法确定问题发生在哪个环境以及出现了什么“奇怪”的情况。

无论如何,有一种替代方法可以使用\.presentationMode来关闭弹出窗口,如下所示:

更新:好吧,我发现原始问题可能涉及到macOS,因为在macOS上提供的弹出窗口不会在所描述的场景下关闭。

以下是适用于iOS/macOS平台的使用变体(已经进行了测试并且在Xcode 11.3 / macOS 10.15上运行良好):

struct Pop: View {
    @Binding var showSheet: Bool
    //@Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        VStack {
            Text("Option 1")
            Text("Option 2")
            Button("Cancel")
            {
                #if os(OSX)
                NSApp.sendAction(#selector(NSPopover.performClose(_:)), to: nil, from: nil)
                #else
                //self.presentationMode.wrappedValue.dismiss() // << behaves the same as below
                self.showSheet = false
                #endif
            }
        }
    }
}

谢谢 - 有没有办法减小iOS中弹出窗口的大小 - 它总是几乎全屏显示 - undefined
我的问题的根本原因是另一个:我在https://stackoverflow.com/questions/60152674/swiftui-popup-does-not-dismiss中进行了描述。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接