swift - SwiftUI - 将删除操作(带索引)添加到警报按钮
问题描述
我有一个 DataManager,其中有以下删除函数:
func deleteValue(index: Int) {
storage.remove(at: index)
save()
}
然后在另一个视图中,我将所有值都放入了一个表单中。我不想使用 .onDelete,因为我想要一个警报,让用户决定他/她是否真的想删除该值,但这样做我必须插入索引。我该怎么做呢?这是代码:
@State var showAlertDelete = false
var dm : DataManager
var deleteButton : some View {
Button(action: {
showAlertDelete = true
}) { Text("Delete").foregroundColor(Color.red)
}.alert(isPresented: $showAlertDelete, content: {
deleteValueAlert
})
}
func deleteValue(at offset: IndexSet) {
guard let newIndex = Array(offset).first else { return }
dm.deleteValue(index: newIndex)
}
var deleteValueAlert : Alert {
Alert(title: Text("Are you sure you want to delete this?"), primaryButton: Alert.Button.default(Text("Yes")){ deleteValue //Here it says that I must add the init with the index }, secondaryButton: Alert.Button.cancel(Text("No")))
}
我该如何解决这个问题?谢谢大家!
解决方案
您还可以通过在触发时显示警报来使用 .onDelete,只需添加:
@State private var showAlert = false
@State private var indexSetToDelete: IndexSet?
然后在您的 .onDelete 方法中:
.onDelete { (indexSet) in
self.showAlert = true
self.indexSetToDelete = indexSet
}
最后一步是在您的视图正文中添加警报,您可以在其中调用您的删除方法:
.alert(isPresented: $showAlert) {
Alert(title: Text("Confirm Deletion"),
message: Text("Are you sure you want to delete xxx?"),
primaryButton: .destructive(Text("Delete")) {
self.deleteValue(indexSet: self.indexSetToDelete!) //call delete method
},
secondaryButton: .cancel())
}