iOS 16新导航逻辑下如何将navigationBarItems升级为toolbar?
你的问题出在错误地将NavigationLink放在Button的action闭包中——NavigationLink是SwiftUI视图,必须作为视图层级的一部分渲染,而不是在动作闭包里创建,这就是出现「导航链接初始化器未使用」警告的原因,同时这种写法也不会触发页面跳转。
下面提供两种正确的实现方案:
方案一:直接在ToolbarItem中放置NavigationLink
和旧版navigationBarItems的逻辑一致,直接把NavigationLink作为ToolbarItem的内容,不需要额外包裹Button:
struct MyNewView: View { var body: some View { VStack { Text("The New View") } .navigationTitle("Our New View") .toolbar { ToolbarItem(placement: .navigationBarTrailing) { NavigationLink(destination: GoToNewView()) { Image(systemName: "plus") .resizable() .frame(width: 18, height: 18) } } } } }
方案二:使用NavigationStack + 路径绑定(iOS 16+ 推荐)
如果你的项目已经采用iOS16引入的NavigationStack,更推荐通过绑定导航路径的方式实现跳转,这种方式更灵活,便于控制导航栈:
首先在父视图中定义导航路径:
// 假设父视图是包含NavigationStack的页面 struct ParentView: View { @State private var navigationPath = NavigationPath() var body: some View { NavigationStack(path: $navigationPath) { MyNewView(navigationPath: $navigationPath) .navigationDestination(for: String.self) { route in if route == "GoToNewView" { GoToNewView() } } } } }
然后修改MyNewView,通过Button触发路径添加:
struct MyNewView: View { @Binding var navigationPath: NavigationPath var body: some View { VStack { Text("The New View") } .navigationTitle("Our New View") .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button(action: { navigationPath.append("GoToNewView") }) { Image(systemName: "plus") .resizable() .frame(width: 18, height: 18) } } } } }
补充说明
- 方案一适合简单的跳转场景,迁移成本最低,和旧代码逻辑对齐;
- 方案二是iOS16+导航系统的推荐用法,支持更复杂的导航栈管理(比如多层跳转、栈清空等)。
内容的提问来源于stack exchange,提问作者Galen Smith
相关产品推荐
相关产品推荐

