SwiftUI — добавить действие удаления (с индексом) к кнопке предупреждения

#swift #swiftui #alert

#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")))
}
 

Как я могу это решить? Спасибо всем!

Ответ №1:

Вы можете использовать .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())
}
 

Комментарии:

1. фантастическое решение, ребята

2. У этого решения есть проблема, заключающаяся в том, что мы видим анимацию удаления контакта — затем она снова появляется, когда нас просят подтвердить, а затем, если мы подтвердим, она исчезнет. Есть ли какой-либо способ скрыть удаленный контакт, пока мы не узнаем, удалять его или нет? (Единственное решение, которое я могу придумать, это временно удалить элемент из списка и восстановить его, если пользователь отменит?)