← Назад к вопросам

Что такое UITableViewDelegate?

2.2 Middle🔥 152 комментариев
#UIKit и верстка

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое UITableViewDelegate?

UITableViewDelegate — это протокол в UIKit, который определяет методы для управления поведением и внешним видом таблицы (UITableView), а также обработки взаимодействий пользователя с её элементами. В архитектуре Model-View-Controller (MVC), делегат таблицы выступает в роли контроллера, связывая данные (модель) с визуальным представлением (видом — таблицей). Он отвечает за аспекты, связанные с отображением и событиями, но не за данные — за них отвечает отдельный протокол UITableViewDataSource.

Основная задача UITableViewDelegate — предоставить тонкую настройку таблицы без необходимости создания подклассов UITableView. Делегат позволяет контролировать высоту строк, внешний вид заголовков и подвалов, обработку выбора ячеек, а также действия при свайпах и редактировании.

Ключевые методы UITableViewDelegate

Методы делегата можно условно разделить на несколько категорий:

1. Настройка отображения и высоты элементов

  • tableView(_:heightForRowAt:) — задаёт высоту конкретной строки. Для динамической высоты возвращают UITableView.automaticDimension.
  • tableView(_:viewForHeaderInSection:) и tableView(_:viewForFooterInSection:) — кастомизация заголовков и подвалов секций.
  • tableView(_:heightForHeaderInSection:) и tableView(_:heightForFooterInSection:) — управление высотой этих областей.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Возвращаем фиксированную или динамическую высоту
    return indexPath.row == 0 ? 80 : UITableView.automaticDimension
}

2. Обработка выбора и выделения ячеек

  • tableView(_:didSelectRowAt:) — вызывается при тапе на ячейку. Здесь обычно выполняется переход к детальному экрану или изменение состояния.
  • tableView(_:willSelectRowAt:) и tableView(_:willDeselectRowAt:) — позволяют контролировать или запрещать выбор/снятие выбора.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true) // Снимаем выделение
    let item = dataSource[indexPath.row]
    showDetail(for: item) // Переходим к деталям
}

3. Управление редактированием и действиями при свайпах

  • tableView(_:commit:forRowAt:) — обрабатывает подтверждение действий редактирования (удаление, вставка).
  • tableView(_:trailingSwipeActionsConfigurationForRowAt:) и tableView(_:leadingSwipeActionsConfigurationForRowAt:) (iOS 11+) — настройка кастомных действий при свайпах (например, "Удалить", "Архивировать").
func tableView(_ tableView: UITableView, 
               trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .destructive, title: "Удалить") { action, view, completion in
        self.deleteItem(at: indexPath)
        completion(true)
    }
    return UISwipeActionsConfiguration(actions: [deleteAction])
}

4. Контроль жизненного цикла ячеек

  • tableView(_:willDisplay:forRowAt:) — вызывается перед отображением ячейки. Полезен для анимаций, предзагрузки данных или настройки внешнего вида.
  • tableView(_:didEndDisplaying:forRowAt:) — уведомляет о скрытии ячейки, что можно использовать для освобождения ресурсов (например, отмены загрузки изображения).

Отличие от UITableViewDataSource

Важно понимать разграничение ответственности:

  • DataSource (например, tableView(_:cellForRowAt:)) отвечает за контент — что отображать (ячейки, количество строк, секций).
  • Delegate отвечает за поведение и внешний вид — как отображать и реагировать на действия.

Пример настройки делегата на практике

class ViewController: UIViewController, UITableViewDelegate {
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self // Назначаем текущий контроллер делегатом
        tableView.dataSource = self // Источник данных — отдельно
    }
    
    // Делегат: настраиваем высоту
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }
    
    // Делегат: обрабатываем выбор
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // Логика перехода или обновления
    }
}

Заключение

UITableViewDelegate — это мощный инструмент для кастомизации и интерактивности таблиц в iOS. Он обеспечивает детальный контроль над визуальными аспектами и пользовательскими взаимодействиями, позволяя создавать гибкие и отзывчивые интерфейсы. В сочетании с UITableViewDataSource и современными подходами (например, дифференциальными источниками данных в iOS 13+), делегат остаётся фундаментальной частью работы с таблицами, даже несмотря на появление более декларативных альтернатив, таких как SwiftUI. Понимание его методов и их своевременного вызова критично для оптимизации производительности и создания плавного пользовательского опыта.