NavigationStack(iOS 16+)是 SwiftUI 的数据驱动导航容器:你不再命令式地压入 view controller,而是绑定一个由值构成的数组 path,栈会为每个值渲染一个屏幕。数据向下通过视图初始化器和环境流动,向上通过 binding 和回调流动。
工作原理
你通过修改一个 path 来驱动导航,并用 把值类型映射到目标视图。
NavigationStack(iOS 16+)是 SwiftUI 的数据驱动导航容器:你不再命令式地压入 view controller,而是绑定一个由值构成的数组 path,栈会为每个值渲染一个屏幕。数据向下通过视图初始化器和环境流动,向上通过 binding 和回调流动。
你通过修改一个 path 来驱动导航,并用 把值类型映射到目标视图。
@StatenavigationDestinationstruct AppView: View {
@State private var path: [Route] = [] // the navigation stack, as data
var body: some View {
NavigationStack(path: $path) {
List(products) { p in
NavigationLink("Open", value: Route.detail(p.id)) // append value
}
.navigationDestination(for: Route.self) { route in
switch route {
case .detail(let id): DetailView(id: id)
}
}
}
}
}
enum Route: Hashable { case detail(Int) }
因为 path 是纯数据,你可以通过设置 path = [.detail(42)] 来深度链接,或用 path.removeAll() 回到根——导航变成了可测试、可序列化的状态。
DetailView(id:))传值,或用 .environmentObject(...) / @Environment 系统共享横切关注的对象。@Binding 或调用父视图提供的闭包。Hashable。navigationDestination 为每个类型只注册一次;对同一类型的多次注册会冲突。数据驱动的导航让深度链接、状态恢复和「往回弹三个屏幕」这类流程变得轻而易举,因为栈就是你所拥有的一个数组。面试官问这个是想看你是否把导航建模为状态——这是现代 SwiftUI 的做法——而不是和老式命令式的 NavigationView 较劲。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠