我想创建一个应用程序,用户将按一个按钮,然后在他们选择一个选项时弹出另一个警报。当我尝试类似的事情时
struct ContentView: View {
@State private var showingAlert = false
@State private var showingAlertII = false
var body: some View {
Button(action: {
self.showingAlert = true
}, label: {
Text("button")
.alert(isPresented: $showingAlert) {
Alert(title: Text("Option one or two"), message: Text("choose"), primaryButton: .default(Text("one"), action: {
// do some specific actions
self.showingAlertII = true
}), secondaryButton: .default(Text("two"), action: {
//do some other stuff
self.showingAlertII = true
}))
}
.alert(isPresented: $showingAlertII) {
Alert(title: Text("Option A or B"), message: Text("choose"), primaryButton: .default(Text("Split"), action: {
// do something
}), secondaryButton: .default(Text("B"), action: {
//do something
}))
}
})
没有警报显示。请注意,还有另一个教程:How can I have two alerts on one view in SwiftUI?与此类似,但是,使用.first表示法并返回一个或另一个教程对我而言将不起作用,因为我希望两者都一个接一个地显示。
答案 0 :(得分:2)
您不能直接在彼此后面进行两个.alert调用,而不会覆盖其中一个。关键是要在单个.alert调用中获取所有逻辑。
import SwiftUI
enum ActiveAlert {
case first, second, third
}
struct ContentView: View {
@State private var showingAlert = false
@State private var activeAlert: ActiveAlert = .first
var body: some View {
Button(action: {
self.showAlert(.first)
}, label: {
Text("button")
.alert(isPresented: $showingAlert) {
switch activeAlert {
case .first:
return Alert(title: Text("First Alert"), dismissButton: .default(Text("Next"), action: {
self.showAlert(.second)
}))
case .second:
return Alert(title: Text("Second Alert"), dismissButton: .default(Text("Next"), action: {
self.showAlert(.third)
}))
case .third:
return Alert(title: Text("Third Alert"), dismissButton: .default(Text("Ok"), action: {
//...
}))
}
}
})
}
func showAlert(_ active: ActiveAlert) -> Void {
DispatchQueue.global().async {
self.activeAlert = active
self.showingAlert = true
}
}
}