在SwifUI中以编程方式关闭弹出框

时间:2020-02-09 01:42:18

标签: macos swiftui popover nspopover

我尝试通过设置变量来消除弹出窗口,将其显示为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
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

目前尚不清楚在哪个环境中以及究竟发生了什么奇怪,因为经过测试,所提供的代码在Xcode 11.2 / 3 +和iOS13.2 +上都能很好地工作。

无论如何,都可以使用\.presentationMode来关闭弹出窗口,如下所示

更新:好吧,我发现最初的问题可能与macOS有关,因为在macOS popover上提供的问题并未针对所描述的情况而结束。

这是两种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
            }
        }
    }
}