【问题标题】:How can you show multiple alert dialogs, one after the other, in SwiftUI?如何在 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()
    }
}

【问题讨论】:

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

标签: swiftui


【解决方案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 是的,我只是忘记添加。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多