Что такое двухстраничная навигация в SwiftUI
Что проверяют
Термина «двухстраничная навигация» в SwiftUI нет: за формулировкой стоит обычная связка списка и экрана деталей. Проверяют, каким стеком навигации вы пользуетесь сегодня и как передаёте данные между экранами, не превращая переход в глобальное состояние приложения.
Как отвечать
Современная основа это NavigationStack: контейнер с собственным путём, NavigationLink со значением и модификатор navigationDestination, который сопоставляет тип значения с экраном.
struct RootView: View {
@State private var path: [Item] = []
var body: some View {
NavigationStack(path: $path) {
List(items) { item in
NavigationLink(item.title, value: item)
}
.navigationDestination(for: Item.self) { item in
DetailView(item: item)
}
}
}
}Данные на второй экран уезжают параметрами инициализатора, обратно поднимаются через Binding или замыкание. Путь в состоянии даёт программную навигацию: очистить массив значит вернуться в корень, добавить элемент значит открыть экран без нажатия. Для планшетной раскладки с постоянной боковой колонкой берут NavigationSplitView.
Где спотыкаются
Отвечают через NavigationView и NavigationLink с параметром destination. Связка устаревшая, и у неё есть практическое следствие: внутри списка целевой экран создаётся заранее для каждой строки вместе со всеми его запросами.
Кладут входные данные в собственное состояние целевого экрана. Свойство с оберткой State берёт значение один раз при создании и дальше игнорирует новое, поэтому экран показывает устаревший объект. Входящее это константа или Binding.
Не могут сказать, где живёт состояние навигации, и возвращаются в корень флагами в синглтоне. Путь стека это обычные данные, и хранить его нужно там же, где остальную модель экрана.