在按钮 swiftUI 中配置 2 警报消息

config 2 alerts messages in button swiftUI

我要学习 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"))) }

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

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

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

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
}

虽然 [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..."))
        }
    }
}

那就和Raja的回答一样:

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

@State var resultAlert: ResultAlert?

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

停用它

然后这样呈现:

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