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

SwiftUI:在popover.show之后重新初始化,swift,macos,swiftui,Swift,Macos,Swiftui,我正在使用popover编写一个MacOS(10.15 Catalina)应用程序。主ContentView包括一个带有简单切换的自定义视图: class AppDelegate:NSObject,NSApplicationDelegate{ var popover=nspover() func ApplicationIDFinishLaunching(通知:通知){ self.popover.contentViewController=NSHostingController(rootView:

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

class AppDelegate:NSObject,NSApplicationDelegate{
var popover=nspover()
func ApplicationIDFinishLaunching(通知:通知){
self.popover.contentViewController=NSHostingController(rootView:contentView)
self.statusBarItem=NSStatusBar.system.statusItem(长度:18)
如果让statusBarButton=self.statusBarItem.button{
statusBarButton.title=”☰"
statusBarButton.action=#选择器(切换弹出(:))
}
func show(){
让statusBarButton=self.statusBarItem.button!
self.popover.show(relativeTo:statusBarButton.bounds,of:statusBarButton,preferredEdge:NSRectEdge.maxY)
}
func hide(){
popover.performClose(无)
}
@objc func切换切换切换(uu发送方:AnyObject?){
self.popover.isShown?隐藏():显示()
}
}
结构ContentView:View{
var body:一些观点{
测试(“你好”)
//更多的东西
}
}
结构测试:视图{
var消息:字符串
@单击的状态私有变量:Bool=false
初始化(消息:字符串){
self.message=消息
_单击=状态(初始值:false)
打印(“初始化”)
}
var body:一些观点{
回钉{
文本(消息)
按钮(“点击”){
self.clicked=true
}
如果!自我点击{
文本(“之前”)
}
否则{
文本(“之后”)
}
}
}
}
每当弹出窗口再次出现时,我想在自定义视图中重新初始化一些数据。因此,在本例中,
单击的
应重置为
false
。我尝试了在许多搜索中找到的
@Binding
@State
变量的所有组合,但似乎都不起作用。看起来,
.onAppear()
仅在第一次启动时启动

init()
函数就在那里,因为在我的应用程序中,我还需要包含额外的内容和代码。在本例中,我尝试使用它初始化
单击的
状态变量,但是,尽管
print()
函数确实打印,但变量似乎没有被重置


如何重新初始化
@State
变量?

要在init中初始化State,您不应该将其初始化为属性(因为属性在init之前初始化,而State只初始化一次),因此

struct测试:视图{
var消息:字符串

@国家私有var clicked:Bool//谢谢,但我仍然发现
clicked
似乎是
true
,因为
之后的
文本在第一次之后仍然显示。不清楚在哪个时刻(或在哪个事件)您需要重置单击的
,因此缺少代码-您能澄清一下吗?我已经包含了一个非常简短的AppDelegate版本。想法是当我再次显示弹出窗口时,
测试
视图应该重置。尝试使用
测试(“Hello”).id(UUID())重新创建它
成功了。我可以猜出那里发生了什么,但这是一个肮脏的把戏吗?是否可以将该把戏合并到
测试
视图中,使其独立?
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
}