一尘不染

如何在SwiftUI的一个视图上显示两个警报?

swift

我想将两个唯一的警报附加到同一Button视图。当我使用下面的代码时,只有底部的警报起作用。

我正在macOS Catalina上使用Xcode 11的正式版本。

@State private var showFirstAlert = false
@State private var showSecondAlert = false

Button(action: {
    if Bool.random() {
        showFirstAlert = true
    } else {
        showSecondAlert = true
    }
}) {
    Text("Show random alert")
}
.alert(isPresented: $showFirstAlert) {
    // This alert never shows
    Alert(title: Text("First Alert"), message: Text("This is the first alert"))
}
.alert(isPresented: $showSecondAlert) {
    // This alert does show
    Alert(title: Text("Second Alert"), message: Text("This is the second alert"))
}

我希望在设置showFirstAlert为true
时显示第一个警报,而在我设置为true时希望显示第二个警报showSecondAlert。只有第二个警报显示其状态为true时,但第一个警报不执行任何操作。


阅读 278

收藏
2020-07-07

共1个答案

一尘不染

第二个调用.alert(isPresented)覆盖了第一个。您真正想要的是Binding<Bool>指示是否显示警报,以及应该从闭包后面返回警报的某种设置.alert(isPresented)。您可以为此使用Bool,但是我继续使用枚举来完成此操作,因为它扩展为两个以上的警报。

enum ActiveAlert {
    case first, second
}

struct ToggleView: View {
    @State private var showAlert = false
    @State private var activeAlert: ActiveAlert = .first

    var body: some View {

        Button(action: {
            if Bool.random() {
                self.activeAlert = .first
            } else {
                self.activeAlert = .second
            }
            self.showAlert = true
        }) {
            Text("Show random alert")
        }
        .alert(isPresented: $showAlert) {
            switch activeAlert {
            case .first:
                return Alert(title: Text("First Alert"), message: Text("This is the first alert"))
            case .second:
                return Alert(title: Text("Second Alert"), message: Text("This is the second alert"))
            }
        }
    }
}
2020-07-07