如何在快速ui中显示两个警报,一个随后显示另一个

时间:2020-03-07 22:57:16

标签: swift swiftui

我想创建一个应用程序,用户将按一个按钮,然后在他们选择一个选项时弹出另一个警报。当我尝试类似的事情时

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表示法并返回一个或另一个教程对我而言将不起作用,因为我希望两者都一个接一个地显示。

1 个答案:

答案 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
        }
    }
}