将绑定值传递给新的NSWindow?

时间:2020-04-18 19:58:29

标签: macos swiftui nswindow nswindowcontroller

在此用于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都没有初始化我尝试哪种组合。

我正在尝试此操作,因为我认为解决方案是使用绑定值,但是我当然可能错了。

所以,双重问题:

  • 如何将这个绑定值传递给窗口控制器和窗口?

  • 也许我在想这个错误,在这种情况下,管理关闭的窗口的正确方法是什么?

(总而言之,目标是:单击主视图中的按钮,使用新视图打开窗口,然后在用户关闭窗口时在主视图中执行某些操作)

0 个答案:

没有答案