SwiftUI-警报仅在设置其状态变量一次后显示两次

时间:2019-11-30 16:29:42

标签: swift swiftui

我想让该按钮运行某个命令,如果失败,我希望它显示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
}

3 个答案:

答案 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
 }