SwiftUI:在popover.show之后重新初始化
我正在使用popover编写一个MacOS(10.15 Catalina)应用程序。主ContentView包括一个带有简单切换的自定义视图: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:
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
}