【问题标题】:config 2 alerts messages in button swiftUI在按钮 swiftUI 中配置 2 警报消息
【发布时间】:2021-07-19 16:49:54
【问题描述】:

我要学习 swift 和 swiftUI。 我申请按类别整理笔记。如果需要,可以在我的 GitHub 中找到我的项目。 https://github.com/yoan8306/List-Notes 我有问题。我认为这很简单。我想发出 2 条警报消息。第一个是保存成功,第二个是出现问题,例如一个字段为空或类别为空。

private func checkNoteIsOk() -> Bool{
        if !noteTitleField.isEmpty && !noteField.isEmpty && categorySelected != nil {
          return true
        } else {
            return false
        }
    }
.

Button(action: {
                        guard checkNoteIsOk() else {
                       presentAlert = true
                            return
                        }
                        coreDM.saveNote(noteData: noteField, noteTitle: noteTitleField,
                                          noteDate: Date(), noteCategory: categorySelected!)
                        emptyField()
                        
                        saveSuccess = true
                          },
                            label: {
                              Text("Save")
                            }
                    ) 
    } 

   
//end Vstak
      .navigationTitle("Create new note")
      
      .alert(isPresented: $presentAlert) {
                Alert(title: Text("Error !"), message: Text("Not saved"),
                dismissButton: .default(Text("OK"))) }
            
      .alert(isPresented: $saveSuccess) {
        Alert(title: Text("Success !"), message: Text("Insert with success !"),
        dismissButton: .default(Text("OK"))) }

我认为这是因为它们是两条警报消息。并且只能显示最后一条消息警报。感谢您的回答和帮助。

【问题讨论】:

    标签: swift model-view-controller mvvm swiftui uialertview


    【解决方案1】:

    对于单个视图中的多个警报,您可以使用枚举。

    首先,您需要像这样创建一个枚举并定义所有警报消息

    enum AlertType: Identifiable {
        var id: UUID {
            return UUID()
        }
        
        case success
        case error
        
        var title: String {
            switch self {
            case .success:
                return "Success !"
            case .error:
                return "Error !"
            }
        }
        
        var message: String {
            switch self {
            case .success:
                return "Insert with success !"
            case .error:
                return "This category already exist !!"
            }
        }
    }
    

    现在在视图中创建一个状态变量。

    struct NewCategoryView: View {
        @State private var alertType: AlertType?
        
        // Other code
    }
    

    并在末尾添加警报

    //end Vstak
    .navigationTitle("New Category")
    .onAppear(perform: { updateCategoryList()} )
    .alert(item: self.$alertType, content: { (type) -> Alert in
        Alert(title: Text(type.title), message: Text(type.message),
              dismissButton: .default(Text("OK")))
    })
    

    现在通过分配值来显示警报。像这样

    if condition_true {
        alertType = AlertType.success //<-- Here
    } else {
        alertType = AlertType.error //<-- Here
    }
    

    【讨论】:

    • 太棒了!!谢谢!
    【解决方案2】:

    虽然 [Raja] 的回答有效。我不认为这是理想的,因为

    • 它会生成随机的 UUID,Apple 不鼓励在不需要时使用。
    • 它确实需要多个 switch 语句,而只需要一个。

    一个更简单的解决方案可能是像这样定义枚举

    enum ResultAlert: Int8, Identifiable {
        case success, error
    
        var id: some Hashable { rawValue }
        var content: Alert {
            switch self {
            case .success: return Alert(title: Text("Success!"))
            case .error: return Alert(title: Text("Oy, error..."))
            }
        }
    }
    

    那么剩下的和拉贾的回答一样:

    将其作为@State 变量添加到您的视图中

    @State var resultAlert: ResultAlert?
    

    使用resultAlert = .successresultAlert = .error 激活它。使用resultAlert = .none停用它

    并像这样呈现它:

    .alert(item: $resultAlert, content: \.content)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2018-11-27
      相关资源
      最近更新 更多