SwiftUI:在popover.show之后重新初始化

时间:2020-10-11 05:07:00

标签: swift macos swiftui

我正在使用弹出窗口编写MacOS(10.15 Catalina)应用程序。主要的ContentView包括一个带有简单切换的自定义视图:

a

我想在弹出窗口再次出现时在自定义视图中重新初始化一些数据。因此,在此示例中,class AppDelegate: NSObject, NSApplicationDelegate { var popover=NSPopover() func applicationDidFinishLaunching(_ aNotification: Notification) { self.popover.contentViewController = NSHostingController(rootView: contentView) self.statusBarItem = NSStatusBar.system.statusItem(withLength: 18) if let statusBarButton = self.statusBarItem.button { statusBarButton.title = "☰" statusBarButton.action = #selector(togglePopover(_:)) } func show() { let statusBarButton=self.statusBarItem.button! self.popover.show(relativeTo: statusBarButton.bounds, of: statusBarButton, preferredEdge: NSRectEdge.maxY) } func hide() { popover.performClose(nil) } @objc func togglePopover(_ sender: AnyObject?) { self.popover.isShown ? hide() : show() } } struct ContentView: View { var body: some View { Test("Hello") // more stuff } } struct Test: View { var message: String @State private var clicked: Bool = false init(message: String) { self.message = message _clicked = State(initialValue: false) print("init") } var body: some View { return HStack { Text(message) Button("Click") { self.clicked = true } if !self.clicked { Text("Before") } else { Text("After") } } } } 应该重置为clicked。我尝试了在许多搜索中都能找到的false@Binding变量的每种组合,但似乎没有任何效果。看来@State只在第一次触发。

这里有.onAppear()函数,因为在我的应用程序中,我还需要包括其他内容和代码。在此示例中,我尝试使用它来初始化init()状态变量,但是尽管clicked函数确实可以打印,但该变量似乎没有被重置。

如何重新初始化print()变量?

1 个答案:

答案 0 :(得分:0)

要在init中初始化状态,请勿将其初始化为属性(因为属性在之前 init初始化,并且状态仅初始化一次),所以

struct Test: View {
    var message: String
    @State private var clicked: Bool     // << here, only declare

    init(message: String) {
        self.message = message
        _clicked = State(initialValue: false)   // << then this works
        print("init")
    }
    
    // ... other code
}