我想将两个独特的alert 附加到同一个Button视图.当我使用下面的代码时,只有底部的alert 起作用.

我正在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时,第一个alert 会显示,当我将showSecondAlert设置为true时,第二个alert 会显示.只有第二个alert 显示其状态为真,但第一个alert 什么也不做.

推荐答案

第二次调用.alert(isPresented)将覆盖第一次调用.您真正想要的是一个Binding<Bool>来表示是否显示alert ,以及一些设置,对于.alert(isPresented)之后的闭包应该返回哪个alert .你可以使用Bool来实现这一点,但我继续使用enum,因为它可以扩展到两个以上的alert .

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"))
            }
        }
    }
}

Swift相关问答推荐

Swift 5.10:无法从非隔离的deinit访问属性*,这是Swift 6中的错误''''

纹理资源加载问题(图像解码失败)

Swift concurrency reload/await,支持只执行成功并重试

不能将符合协议的SWIFT类的实例分配给需要该协议的Objective-C属性

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

如何获取嵌套数组中项的路径以修改数组?

如何使用Duration.TimeFormatStyle以h m s格式快速格式化时间

使用View()和List()无法显示影子

从 Obj-C 函数返回 swift 类的不兼容指针类型

如何在 SwiftUI 中为过渡动画保持相同的标识

数组中某些元素的总和

如何让飞机与 RealityKit 中的物体相撞

在 Vapor 4 中使用协议的通用流利查询

try 制作一个 Swift 扩展来替换字符串中的多次出现

为什么swiftui中的导航视图栏那么大?

让我的函数计算数组 Swift 的平均值

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

我可以在 Swift 中为泛型类型 T 分配默认类型吗?

为什么我可以转换为 NSManagedObject 但不能转换为我的实体类型?

Swift:创建 UIImage 数组