лист не может быть закрыт после отображения предупреждения
Я пытаюсь показать оповещения на листе в SwiftUI. У меня есть кнопки «Отмена» и «Сохранить» на листе, и обе они закрываются после выполнения действия. Если при сохранении возникает ошибка, появляется всплывающее предупреждение. Однако лист нельзя закрыть после отображения предупреждения. И сохранение, и отмена не могут быть отклонены после нажатия на предупреждение об отклонении. Не могу понять причину. Любая помощь будет оценена по достоинству. Спасибо.
Связанный код
.navigationBarItems(
leading:
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Cancel")
.foregroundColor(Color("OrangeColor"))
.font(.custom("Montserrat-Medium", size: 18))
},
trailing:
Button(action: {
if selectedBook == nil {
errorInfo = AlertInfo( id: .bookNotSelectedError,
title: "Please choose a book",
message: "")
}
if quote.isEmpty {
errorInfo = AlertInfo( id: .quoteEmptyError,
title: "Please choose a quote",
message: "")
}
if let book = selectedBook {
// Save operations
}
self.presentationMode.wrappedValue.dismiss()
})
{
Text("Save")
.foregroundColor(Color("OrangeColor"))
.font(.custom("Montserrat-Medium", size: 18))
}
.alert(item: $errorInfo, content: { info in
Alert(title: Text(info.title),
message: Text(info.message))
})
)
Структура информации о предупреждении
struct AlertInfo: Identifiable {
enum AlertType {
case saveError
case bookNotSelectedError
case quoteEmptyError
case totalPageError
case currentPageError
}
let id: AlertType
let title: String
let message: String
}
1 ответ
Ваша кнопка СОХРАНИТЬ проверяет наличие ошибок, но затем всегда вызывает отклонение (), поэтому предупреждение появляется, но сразу же исчезает. Также вы должны проверить ошибки, используя ..else if...
Вот как это должно работать:
Button(action: {
if selectedBook == nil {
errorInfo = AlertInfo( id: .bookNotSelectedError,
title: "Please choose a book",
message: "")
}
else if quote.isEmpty {
errorInfo = AlertInfo( id: .quoteEmptyError,
title: "Please choose a quote",
message: "")
}
else if let book = selectedBook {
// only call dismiss() after save was successful
presentationMode.wrappedValue.dismiss()
}
// NO dismiss here!
})
{
Text("Save")
}
Также обратите внимание, что Alert и alert(item:content:) устарели.