Как работает UITableView в iOS (Swift)?

«Как работает UITableView в iOS (Swift)?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

UITableView — это ключевой компонент UIKit для отображения прокручиваемых списков данных. Его работа основана на принципах переиспользования ячеек и разделения ответственности через протоколы.

Основные компоненты:

  1. UITableViewDataSource — протокол, поставляющий данные и ячейки для таблицы.

    // Обязательные методы:
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Переиспользование ячейки — ключ к производительности
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath)
        cell.textLabel?.text = dataArray[indexPath.row]
        return cell
    }
  2. UITableViewDelegate — протокол, отвечающий за внешний вид и взаимодействие (высота строк, выбор, заголовки секций).

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Обработка нажатия на строку
        tableView.deselectRow(at: indexPath, animated: true)
    }

Жизненный цикл ячейки и переиспользование: Когда ячейка уезжает за пределы экрана, она не уничтожается, а помещается в очередь переиспользования. Когда требуется отобразить новую строку, система вызывает dequeueReusableCell, чтобы взять ячейку из очереди, избегая дорогостоящего создания нового объекта. Поэтому в cellForRowAt необходимо полностью переконфигурировать ячейку под новые данные.

Настройка:

  • Регистрация ячейки: Необходима до использования. Можно зарегистрировать класс или UINib (xib-файл).
    tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCell")
  • Секции: Таблица может иметь несколько секций с собственными заголовками и футерами.
  • Современные практики: Использование диффируемых источников данных (UITableViewDiffableDataSource, iOS 13+) упрощает управление состоянием и анимацию обновлений.

Альтернатива: UICollectionView предлагает более гибкие макеты (сетки, карусели), но UITableView остается оптимальным выбором для простых вертикальных списков.