微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在按钮 swiftUI

如何解决在按钮 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。