在此用于MacOS的SwiftUI应用程序中,单击按钮时我将打开一个新窗口。
单击后,只要打开窗口,按钮就会保持突出显示状态-再次单击时,我会关闭窗口并恢复按钮的正常状态。
我正在使用此窗口控制器:
class MyWindowController<RootView: View>: NSWindowController {
convenience init(rootView: RootView) {
let hostingController = NSHostingController(rootView: rootView)
let window = NSWindow(contentViewController: hostingController)
self.init(window: window)
}
}
在我看来,这样称呼它:
struct ContentView: View {
@State private var showWindow = false
@State private var myWindowController: MyWindowController<MyView>?
var body: some View {
Button(action: {
self.showWindow.toggle()
if self.showWindow {
self.myWindowController = MyWindowController(rootView: MyView())
self.myWindowController?.showWindow(nil)
} else {
self.myWindowController?.close()
self.myWindowController = nil
}
}) {
if self.showWindow {
Text("Close")
} else {
Text("Show")
}
}.buttonStyle(MyButtonStyle(isPressed: showWindow))
现在,我不知道的要求是:当用户通过单击红色交通灯(而不是单击)关闭窗口时,我们需要更改按钮的状态(或触发其他操作)主视图中突出显示的专用按钮)。
所以我想我可以通过将绑定值(showWindow
bool)传递给窗口控制器来实现,该绑定值又会将其传递给窗口本身-在窗口中,覆盖{{1 }}方法(单击红色交通灯时会调用),并将布尔值设置为false,以便通过绑定主视图中的按钮可以更改其状态(并执行其他任何相关操作)。
A,没有办法。我尝试在MyWindowController便捷初始化中添加一个Bool参数,该参数将分配给一个close()
属性,但是Xcode一直对我大吼大叫该类没有初始化程序,或者@Binding var isPresented: Bool
都没有初始化我尝试哪种组合。
我正在尝试此操作,因为我认为解决方案是使用绑定值,但是我当然可能错了。
所以,双重问题:
或
(总而言之,目标是:单击主视图中的按钮,使用新视图打开窗口,然后在用户关闭窗口时在主视图中执行某些操作)