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

Как работаешь с навигацией?

2.0 Middle🔥 241 комментариев
#UIKit и верстка#Архитектура и паттерны

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

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

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

Архитектура навигации в iOS-приложениях

В современных iOS-приложениях я использую несколько подходов к навигации, выбирая оптимальный для конкретного сценария. Основные инструменты: UIKit Navigation Controller, SwiftUI Navigation, а также кастомные решения для сложных случаев.

UIKit: UINavigationController и его расширения

UINavigationController остается основным инструментом для иерархической навигации в UIKit-приложениях. Ключевые принципы работы:

// Базовая навигация между ViewController
let detailVC = DetailViewController()
navigationController?.pushViewController(detailVC, animated: true)

// Возврат назад
navigationController?.popViewController(animated: true)

// Возврат к корневому контроллеру
navigationController?.popToRootViewController(animated: true)

Для сложной навигации я часто реализую координаторы (Coordinator Pattern), которые отделяют логику навигации от бизнес-логики ViewController. Пример структуры:

protocol Coordinator {
    var childCoordinators: [Coordinator] { get set }
    var navigationController: UINavigationController { get }
    func start()
}

class MainCoordinator: Coordinator {
    var childCoordinators = [Coordinator]()
    let navigationController: UINavigationController
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    
    func start() {
        let mainVC = MainViewController()
        mainVC.coordinator = self
        navigationController.pushViewController(mainVC, animated: false)
    }
    
    func showDetail(for item: Item) {
        let detailCoordinator = DetailCoordinator(
            navigationController: navigationController,
            item: item
        )
        detailCoordinator.start()
        childCoordinators.append(detailCoordinator)
    }
}

Этот подход обеспечивает:

  • Чистую архитектуру — ViewControllers не знают о других экранах
  • Управление потоком — координаторы контролируют переходы между модулями
  • Легкую тестирование — навигацию можно тестировать отдельно от UI

SwiftUI: современные подходы

В SwiftUI навигация реализована через NavigationStack и NavigationSplitView. Основные методы:

// NavigationStack для линейной навигации
struct ContentView: View {
    @State private var path = NavigationPath()
    
    var body: some View {
        NavigationStack(path: $path) {
            List(1..<10) { number in
                NavigationLink("Item \(number)", value: number)
            }
            .navigationDestination(for: Int.self) { number in
                DetailView(number: number)
            }
        }
    }
}

// Deep linking с NavigationStack
path.append(5) // Прямое открытие DetailView с номером 5

Для сложных приложений я использую Router-based навигацию в SwiftUI, объединяя NavigationStack с состоянием:

class AppRouter: ObservableObject {
    @Published var path = NavigationPath()
    
    func navigateToDetail(item: Item) {
        path.append(item)
    }
    
    func popToRoot() {
        path.removeLast(path.count)
    }
}

Кастомная и модифицированная навигация

Для специфических требований (например, таб-бар с кастомными транзишенами или сложные onboarding-процессы) я создаю кастомные решения:

  • Кастомные переходы через UIViewControllerTransitioningDelegate и UIViewControllerAnimatedTransitioning
  • Гибридные решения для смешанных UIKit/SwiftUI приложений
  • Глубокие ссылки с унифицированной системой обработки URL и универсальных ссылок

Базовые практики и паттерны

В независимости от выбранного инструмента, я соблюдаю следующие принципы:

  • Single Responsibility — каждый компонент отвечает только за свою часть навигации
  • Инверсия зависимостей — модули не зависят от конкретных реализаций переходов
  • Состояние навигации — всегда сохраняется и восстанавливается при необходимости
  • Тестирование — все переходы покрываются unit-тестами через mock-объекты
  • Аналитика — ключевые переходы отслеживаются для аналитики пользовательского поведения

Выбор подхода

Критерии выбора архитектуры навигации:

  1. UIKit vs SwiftUI — зависит от основной технологии проекта
  2. Сложность приложения — для простых линейных приложений достаточно стандартных инструментов
  3. Требования к тестированию — координаторы лучше для изолированного тестирования
  4. Требования к глубоким ссылкам — нужна централизованная система обработки
  5. Анимация и транзишены — кастомные решения для уникальных UX-эффектов

В итоге, навигация в iOS — это баланс между стандартными инструментами Apple и кастомными решениями для конкретных бизнес-потребностей. Я всегда начинаю со стандартных подходов и добавляю кастомные элементы только при доказанной необходимости.

Как работаешь с навигацией? | PrepBro