我正在使用弹出窗口编写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()
变量?
答案 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
}