Ответ
Технически — да, но это не рекомендуется для статической навигации, так как ухудшает читаемость и поддержку кода. Лучше использовать отдельные NavigationLink для каждого экрана.
Один NavigationLink с параметрами tag и selection оправдан только для динамической навигации, где пункты назначения определяются во время выполнения:
enum AppRoute { case profile, settings, detail(id: UUID) }
struct ContentView: View {
@State private var activeRoute: AppRoute?
var body: some View {
NavigationView {
VStack {
Button("Open Profile") { activeRoute = .profile }
Button("Open Settings") { activeRoute = .settings }
}
.background(
NavigationLink(
destination: destinationView(for: activeRoute),
tag: activeRoute,
selection: $activeRoute,
label: { EmptyView() }
)
)
}
}
@ViewBuilder
private func destinationView(for route: AppRoute?) -> some View {
switch route {
case .profile: ProfileView()
case .settings: SettingsView()
case .detail(let id): DetailView(id: id)
case nil: EmptyView()
}
}
}
Современный подход (iOS 16+): Используйте NavigationStack с модификатором navigationDestination, который декларативно связывает значение с представлением:
NavigationStack(path: $navigationPath) {
RootView()
.navigationDestination(for: AppRoute.self) { route in
switch route {
case .profile: ProfileView()
case .settings: SettingsView()
}
}
}