macos - 以编程方式关闭 SwiftUI 中的弹出窗口

标签 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
      }
    }
  }
}

最佳答案

从问题中不清楚在哪个环境中以及究竟发生了什么奇怪,因为经测试,提供的代码适用于 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
            }
        }
    }
}

关于macos - 以编程方式关闭 SwiftUI 中的弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60132819/

相关文章:

ios - 无法更改 SwiftUI 上的暗模式

xcode - 在上一个 View 上居中弹出窗口

iOS:Autolayout 和 popOverController 问题(可能是 Xcode 错误)

java - 在 linux 上运行 dmg 程序

cocoa - 如何以编程方式显示 NSMenu?

objective-c - 执行某些系统事件,Mac OS X

python - 当我安装了 OS X 10.11 时,为什么 pip 会为 OS X 10.12 安装 Pillow?

ios - onDismiss() 在绑定(bind)对象更新之前被调用

swiftui - @EnvironmentObject 通过 navigationLink 不能很好地工作