В этом приложении SwiftUI для macOS я открываю новое окно при нажатии кнопки.
После нажатия кнопка остается подсвеченной до тех пор, пока окно открывается - при повторном нажатии я закройте окно и восстановите нормальное состояние кнопки.
Я использую этот оконный контроллер:
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))
Теперь требование, которое я не могу понять, заключается в следующем: нам нужно изменить состояние кнопки (или инициировать любое другое действие), когда пользователь закрывает окно, нажимая на его красный индикатор c (вместо нажатия на выделенную выделенную кнопку в главном окне).
Поэтому я подумал, что сделаю это, передав значение привязки (showWindow
bool) контроллеру окна, который, в свою очередь, передаст его окну сам - и в окне переопределите метод close()
(который вызывается при нажатии красной лампочки trafi c) и установите для bool значение false, чтобы при связывании кнопка в главном окне могла измениться его состояние (и будет делать любые другие соответствующие действия).
Увы, не может сделать. Я попытался добавить параметр Bool для удобства инициализации MyWindowController, который я бы назначил свойству @Binding var isPresented: Bool
, но XCode продолжает кричать мне, что в классе нет инициализаторов или что isPresented
не инициализируется, независимо от того, какую комбинацию я пытаюсь .
Я пытаюсь это сделать, потому что думаю, что решение состоит в том, чтобы использовать значение привязки, но я могу ошибаться, конечно.
Итак, двойной вопрос:
- как я могу передать это значение привязки оконному контроллеру и окну?
или
- возможно, я думаю, что это неправильно, в этом случае, что бы быть правильным способом управления закрывающимся окном вместо этого?
(Подводя итог, цель состоит в том, чтобы: нажать кнопку на главном экране, открыть окно с новым видом, а затем сделать что-то на главном экране, когда окно закрыто пользователем)