> Как показать пользователю, что все элементы успешно удалены (iOS, Swift)
Уровень: senior · Роль: mobile · Категория: Технические вопросы
Компании: Совкомбанк
Стек: iOS, Swift
> Пример ответа
Короткий ответ
Пользователю нужно показать явный фидбек: пустое состояние (empty state) с иконкой и текстом, либо тост/snackbar с подтверждением. Для iOS это обычно UIContentUnavailableConfiguration (iOS 17+) или кастомный UIView с лейблом. Важно не оставлять экран пустым без объяснения - это выглядит как баг. Если удаление массовое, добавьте анимацию исчезновения ячеек и обновите UI синхронно с моделью данных.
Подробное объяснение
Удаление всех элементов - это терминальное состояние списка. Пользователь должен понять:
- операция прошла успешно (не было ошибки),
- список теперь пуст намеренно,
- что можно сделать дальше (например, добавить новый элемент).
На iOS есть несколько подходов:
- Empty state view - самый распространённый. Показывается, когда
dataSource.isEmpty. ИспользуйтеUIContentUnavailableConfigurationс текстом "Нет элементов" и кнопкой действия. - Toast/overlay - кратковременное сообщение "Все элементы удалены", затем переход к empty state. Подходит, если удаление происходит не на текущем экране (например, из контекстного меню).
- Анимация - при удалении всех ячеек используйте
performBatchUpdatesилиreloadDataсUIView.transition, чтобы избежать мерцания.
Ключевой момент - согласованность: модель данных должна обновиться до UI, иначе возможен crash из-за несоответствия количества строк.
На практике
Для senior-позиции важно показать понимание lifecycle и UX. Опишите сценарий:
- пользователь свайпает или жмёт "Удалить всё";
- показываете confirmation dialog (если операция необратима);
- после подтверждения - анимация удаления ячеек (например,
.fade); - затем отображаете empty state с кнопкой "Добавить".
Если список находится в UICollectionView - используйте snapshot с NSDiffableDataSourceSnapshot, это гарантирует корректное обновление. Для UITableView - deleteRows с indexPaths.
Также упомяните accessibility: UIAccessibility.post(notification: .announcement, argument: "Все элементы удалены") - это важно для VoiceOver.
Пример кода
SWIFTfinal class ItemsViewController: UIViewController {private var items: [Item] = [] {didSet { updateUI() }}private lazy var emptyStateView: UIView = {var config = UIContentUnavailableConfiguration.empty()config.text = "Нет элементов"config.secondaryText = "Добавьте новый элемент, чтобы начать"config.image = UIImage(systemName: "tray")let view = UIContentUnavailableView(configuration: config)view.translatesAutoresizingMaskIntoConstraints = falsereturn view}()private func updateUI() {emptyStateView.isHidden = !items.isEmptytableView.reloadData()if items.isEmpty {UIAccessibility.post(notification: .announcement,argument: "Все элементы удалены")}}func deleteAllItems() {guard !items.isEmpty else { return }let indexPath = IndexPath(row: 0, section: 0)let indexPaths = (0..<items.count).map { IndexPath(row: $0, section: 0) }items.removeAll()tableView.performBatchUpdates {tableView.deleteRows(at: indexPaths, with: .fade)} completion: { _ inself.updateUI()}}}
Как отвечать на собеседовании
Начните с UX-аспекта: "Пользователю нужен явный фидбек, иначе он подумает, что произошла ошибка". Затем переходите к технической реализации: упомяните UIContentUnavailableConfiguration, diffable data source, анимации. Если спросят про старые iOS - скажите, что для iOS 13-16 можно использовать кастомный UIView с UILabel и UIImageView.
Подчеркните, что важно обрабатывать краевые случаи:
- повторное нажатие "Удалить всё" при пустом списке - не должно вызывать ошибку;
- синхронизация с сервером, если удаление асинхронное - показывайте лоадер до ответа.
Что проверяет интервьюер
- Понимание принципов UX (feedback, empty state).
- Знание современных API (iOS 17+).
- Умение работать с
UITableView/UICollectionViewи анимациями. - Внимание к деталям: accessibility, краевые случаи.
- Способность объяснить trade-off между тостом и постоянным empty state.
Типичные ошибки
- Оставить экран просто пустым - без сообщения.
- Не обновить модель данных перед
reloadData- crash. - Использовать
reloadDataвместоdeleteRows- теряется анимация. - Игнорировать VoiceOver - пользователи с ограничениями не получат фидбек.
- Показывать тост, который исчезает, но не переводить экран в empty state - пользователь не поймёт, что делать дальше.
> Похожие задачи по mobile
Что происходит при дедлоке в главной очереди в iOS
Какие альтернативы NSOperation существуют для отслеживания выполнения задач в iOS
Как реализовать удаление нескольких элементов при ограничении бэкенда на один запрос на удаление
Какие проблемы с многопоточностью существуют, например race condition, data race, starvation, priority inversion, deadlock
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью