首页 > 解决方案 > 如何在 SwiftUI 中的一个视图上显示两个警报?

问题描述

我想将两个独特的警报附加到同一个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 时显示,我希望第二个警报在我设置showSecondAlert为 true 时显示。只有第二个警报显示其状态何时为真,但第一个警报什么也不做。

标签: swiftswiftui

解决方案


第二个调用.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"))
            }
        }
    }
}

推荐阅读