如何在 swift ui 中显示两个警报,一个接着另一个

Lou*_*ure 1 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 
                    }))

            }
        })
Run Code Online (Sandbox Code Playgroud)

没有显示任何警报。请注意,还有另一篇教程:How can I have two Alerts on one view in SwiftUI? 然而,与此类似,使用 .first 表示法并返回一个或另一个对我来说不起作用,因为我希望两个都显示,一个接一个。

Kev*_*inP 5

您无法在不覆盖其中一个的情况下直接进行两个 .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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)