我想让该按钮运行某个命令,如果失败,我希望它显示Alert
并说失败。这样做很好,除了显示警报时,它显示两次,但我只设置了一次。
以下是我用来显示警报的两个状态变量:
@State private var alert = false
@State private var alertView = Alert(
title: Text("Well Hello There"),
message: Text("You probably shouldn't be seeing this alert but if you are, hello there! (This is a bug)")
)
这是我的按钮:
Button(action: {
DispatchQueue.global(qos: .background).async {
if let command = action.command {
let error = Connection.shared.run(command: command)
if error != nil {
self.alertView = Alert(
title: Text("Failed to Run Action"),
message: Text("An error occurred while attempting to \(action.label).")
)
print("Displaying alert") // This only gets printed once
self.alert = true
}
}
}
}) {
Text(action.label)
}.alert(isPresented: self.$alert) {
self.alertView
}
答案 0 :(得分:0)
好吧,我想我已经找到了问题所在,如果将alert修饰符放在forEach
中,则实际上由于某种原因它会触发两次。
只需将其拿出来,即可按预期工作。
答案 1 :(得分:0)
这是我在macOS上运行的经验。可能与您的有所不同。
我在Alert()闭包中有一个例程,该例程会触发UI刷新,因为它会更改状态变量。发生刷新是在通过关闭警报提示自动切换“ isPresent”之前发生的,因此视图在刷新期间再次捕获了“ isPresent”。我可以通过在例程中添加一些延迟来避免这种情况,或者以一种更安全的方式将alert修饰符挂接到不受刷新影响的视图上。
答案 2 :(得分:0)
如果您将self.alert强制设置为false怎么办?
.alert(isPresented: self.$alert) {
self.alertView
}.onAppear{
self.alert = false
}