首页 > 解决方案 > 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")))
}

我该如何解决这个问题?谢谢大家!

标签: swiftswiftuialert

解决方案


您还可以通过在触发时显示警报来使用 .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())
}

推荐阅读