В чем разница между UIStackView и UITableView в UIKit?

«В чем разница между UIStackView и UITableView в UIKit?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

UIStackView — это контейнер для компоновки (layout), который автоматически управляет расположением своих дочерних вью по горизонтали или вертикали.

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

Сравнительная таблица

Характеристика UIStackView UITableView
Основное назначение Управление layout статичного набора вью Отображение динамических, прокручиваемых списков данных
Скроллинг Не поддерживает. Для скролла нужно поместить в UIScrollView. Нативная поддержка вертикального (и горизонтального) скролла.
Оптимизация памяти Нет. Все дочерние вью загружаются сразу. Есть. Механизм переиспользования ячеек (dequeueReusableCell).
Структура данных Простая линейная (массив arrangedSubviews). Сложная (секции, строки, заголовки, футеры).
Динамическое изменение Легко добавлять/удалять вью, анимация распределения. Требует обновления данных через insertRows, deleteRows и т.д.

Пример использования UIStackView

// Создание вертикального стека с отступами
let stackView = UIStackView()
stackView.axis = .vertical
stackView.spacing = 10
stackView.alignment = .fill
stackView.distribution = .fillEqually

// Добавление вью
let label = UILabel()
label.text = "Заголовок"
let button = UIButton(type: .system)
button.setTitle("Кнопка", for: .normal)

stackView.addArrangedSubview(label)
stackView.addArrangedSubview(button)

// Для скролла помещаем стек в UIScrollView
let scrollView = UIScrollView()
scrollView.addSubview(stackView)
// ... настройка constraints для stackView внутри scrollView

Пример использования UITableView

class MyViewController: UIViewController, UITableViewDataSource {
    let tableView = UITableView()
    let data = ["Элемент 1", "Элемент 2", "Элемент 3"]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        tableView.dataSource = self
        view.addSubview(tableView)
        // ... настройка frame/constraints
    }

    // Обязательный метод data source
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    // Обязательный метод data source с переиспользованием ячейки
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row]
        return cell // Ячейка конфигурируется и возвращается
    }
}

Когда что использовать?

  • UIStackView: Для статичных форм, групп кнопок, вертикальных/горизонтальных блоков интерфейса, где элементы известны на этапе компиляции.
  • UITableView: Для отображения списков контактов, лент новостей, любых данных, количество которых может меняться и потенциально велико.