> Как показать пользователю, что все элементы успешно удалены (iOS, Swift)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Совкомбанк

Стек: iOS, Swift

> Пример ответа

Короткий ответ

Пользователю нужно показать явный фидбек: пустое состояние (empty state) с иконкой и текстом, либо тост/snackbar с подтверждением. Для iOS это обычно UIContentUnavailableConfiguration (iOS 17+) или кастомный UIView с лейблом. Важно не оставлять экран пустым без объяснения - это выглядит как баг. Если удаление массовое, добавьте анимацию исчезновения ячеек и обновите UI синхронно с моделью данных.

Подробное объяснение

Удаление всех элементов - это терминальное состояние списка. Пользователь должен понять:

  1. операция прошла успешно (не было ошибки),
  2. список теперь пуст намеренно,
  3. что можно сделать дальше (например, добавить новый элемент).

На 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.

Пример кода

SWIFT
final 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 = false
return view
}()
private func updateUI() {
emptyStateView.isHidden = !items.isEmpty
tableView.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: { _ in
self.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 - пользователь не поймёт, что делать дальше.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью