swift - 如何在 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 时显示。只有第二个警报显示其状态何时为真,但第一个警报什么也不做。
解决方案
第二个调用.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"))
}
}
}
}
推荐阅读
- oauth - 如何将 JWT 附加到 JMS 消息?
- azure-devops - 如何授予权限以管理 Azure dev-ops 中的测试计划
- sqlite - 如何在我的飞镖代码 sqlite 中解决这个问题
- python - 多级索引中的 Groupby 时间箱
- typescript - 扩展递归定义的接口成员
- delphi - 将父对象的事件绑定到临时子对象的方法
- html - Bootstrap 4 图像网格对齐
- javascript - 从 Pug 中的字符串插入新行
- asp.net-mvc - ASP.NET Core MVC 在不使用 Http 请求的情况下使用内部 Web API
- java - 春季启动MVC。传递空请求正文