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