如何在 SwiftUI 中一个接一个地显示多个警报对话框?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中一个接一个地显示多个警报对话框?【英文标题】:How can you show multiple alert dialogs, one after the other, in SwiftUI? 【发布时间】:2021-07-11 09:30:50 【问题描述】:

以下代码显示了一个“删除文件”按钮。当用户按下它时,会出现一个确认警报对话框。当用户在第一个对话框上按“删除”时,我想显示第二个警报对话框,确认文件已被删除。但是,它从未出现,即使调试代码确认第二个“return Alert...”语句实际上正在按预期执行。有没有办法让第二个警报也出现?

import SwiftUI

enum alertShownType 
    case alertNone, alertDeleteFile,alertFileDeleted


struct ContentView: View 

    @State var showingAlert = false
    @State var alertShown: alertShownType = alertShownType.alertNone

    var body: some View 
        Button(action: 
            self.alertShown = alertShownType.alertDeleteFile
            self.showingAlert = true
        )
        
            Text("Delete file")
        .padding(EdgeInsets(top: 0, leading: 0, bottom: 10, trailing:0))
        .alert(isPresented: $showingAlert, content: 
            if (alertShown == alertShownType.alertDeleteFile)
            
                return Alert(title: Text("Delete file"),
                      message: Text("Are you sure?"),
                      primaryButton: .destructive(Text("Delete")) 

                        // Delete the file

                        ....

                        // Show the next alert
                        alertShown = alertShownType.alertFileDeleted
                        showingAlert = true
                      ,
                      secondaryButton: .cancel())
            
            else // alertFileDeleted
            
                return Alert(title: Text("File deleted"), message:
                            Text("Done!"),
                      dismissButton: .default(Text("OK")))
            
        )
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

【问题讨论】:

谢谢,但这无济于事。我已经可以使用枚举值从我的应用程序的单个页面显示多个不同的警报。问题是当按下主按钮时,如何在第一个警报的操作中显示第二个警报。 【参考方案1】:

你只需要

public func alert<Item>(item: Binding<Item?>, content: (Item) -> Alert)

不需要@State var showingAlert = false 标志。

像这样设置你的代码

enum alertShownType : Identifiable 
    case alertNone,
    alertDeleteFile,
    alertFileDeleted

    var id : Int  get 
        hashValue
    


struct ContentViewAlerts: View 

    @State var alertShown: alertShownType?
    
    var body: some View 
        Button(action: 
            self.alertShown = alertShownType.alertDeleteFile
        )
        
            Text("Delete file")
        .padding(EdgeInsets(top: 0, leading: 0, bottom: 10, trailing:0))
        .alert(item: $alertShown, content:  alertType in
            if (alertShown == alertShownType.alertDeleteFile)
            
                return Alert(title: Text("Delete file"),
                             message: Text("Are you sure?"),
                             primaryButton: .destructive(Text("Delete")) 
                                
                                // Delete the file
                                
                                //                                ....
                                
                                // Show the next alert
                                alertShown = alertShownType.alertFileDeleted
                             ,
                             secondaryButton: .cancel())
            
            else // alertFileDeleted
            
                return Alert(title: Text("File deleted"), message:
                                Text("Done!"),
                             dismissButton: .default(Text("OK")))
            
        )
    

【讨论】:

太好了。谢谢!只需要进行一项额外的更改。枚举需要是“可识别的”。我已经编辑了你的答案以包含这个新的枚举。 @Ant 是的,我只是忘记添加。谢谢。

以上是关于如何在 SwiftUI 中一个接一个地显示多个警报对话框?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MVVM 在 SwiftUI 中显示警报

当用户输入的时间低于预期时间时,如何在 swiftUI 中显示警报消息?

一个视图中的多个警报只能在 swiftui 中始终使用最后一个警报

SwiftUI 和 macOS:如何检测关闭的最后一个窗口并显示应用程序将退出的警报

如何在没有按钮的 SwiftUI 中显示警报

如何绑定 Bool 值(我从服务器获得)以在 SwiftUI 中隐藏/显示警报?