Как показать пользователю, что все элементы успешно удалены
Что проверяют
Это вопрос на связку UX и UIKit или SwiftUI: знаете ли вы, как в iOS принято сообщать о результате операции, и не станете ли показывать алерт на каждое действие. Следом часто спрашивают, как сделать отмену удаления и что услышит пользователь с VoiceOver.
Как отвечать
Лучшее подтверждение успеха это само изменившееся состояние экрана, а не отдельное окно:
- анимированное удаление: строки уходят из списка с анимацией. В UIKit через
UITableViewDiffableDataSourceиapply(snapshot, animatingDifferences: true), в SwiftUI через изменение массива внутриwithAnimation; - пустое состояние: когда удалено всё, показывается экран «Здесь пока пусто» с подсказкой, что делать дальше. С iOS 17 для этого есть готовые
ContentUnavailableViewв SwiftUI иUIContentUnavailableConfigurationв UIKit; - тактильный отклик:
UINotificationFeedbackGenerator().notificationOccurred(.success)или модификатор.sensoryFeedback(.success, trigger:)в SwiftUI; - отмена: вместо вопроса после удаления лучше короткий баннер с кнопкой «Отменить» на несколько секунд. Данные при этом удаляются отложенно, по истечении таймера, либо откат строится на
UndoManager; - подтверждение до, а не после: массовое безвозвратное удаление подтверждается заранее, через
confirmationDialogилиUIAlertControllerс действием в стиле.destructive; - доступность: VoiceOver анимацию не передаст, поэтому результат стоит озвучить через
UIAccessibility.post(notification: .announcement, argument:).
Отдельно скажите про сеть: если удаление идёт через сервер, интерфейс либо ждёт ответа с индикатором, либо удаляет оптимистично и при сбое возвращает элементы с понятной ошибкой.
Где спотыкаются
Показывают UIAlertController «Успешно удалено» с кнопкой «ОК». Это лишний тап, а Human Interface Guidelines советуют не использовать алерты для сообщений, которые не требуют решения.
Добавляют кнопку «Отменить» в тот же алерт, когда данные уже стёрты. Отмена обещает то, что код выполнить не может.
Вызывают reloadData() после удаления. Анимации нет, и пользователь не понимает, что произошло: список просто мигнул и опустел.