更新Xcode 12.5后部分Navigation Links跳转后立即返回故障
问题原因
这是Xcode 12.5配套的iOS 14.5 SDK中的已知Bug,由NavigationStack状态管理逻辑变更导致,当父视图发生随机重绘时,NavigationLink绑定的selection值会被意外重置,触发自动返回上一级的行为。
解决方案
- 调整NavigationLink的嵌套层级,不要将其放在HStack、ZStack等子容器内部,统一放到导航栈根视图的最外层,避免子容器重绘时影响NavigationLink的状态识别
- 给所有NavigationLink添加
.isDetailLink(false)修饰符,iOS 14.5中修改了split view模式下的默认页面跳转逻辑,该修饰符可以强制页面以push方式进入当前导航栈,避免被系统识别为详情页自动回收 - 替换selection的存储载体,不要使用视图内的局部
@State属性存储selection值,改用@StateObject或者全局@ObservedObject对象中的属性存储,避免局部状态在视图重绘时被意外清空 - 临时兼容方案可以将tag+selection的调用方式替换为isActive绑定方式,每个跳转路径对应独立的Bool状态变量,该方式在iOS 14.5版本中出现异常跳转的概率极低
修正后代码示例
NavigationView { VStack { // 原有业务视图 HStack { ZStack { Button("") { self.selection = "Hole11" }.buttonStyle(ButtonNavigate()) Text("Go To Hole No \(course.hole11no)") .foregroundColor(ColorManager.Purple) .font(.system(size: 16, weight: .bold, design: .rounded)) } } // NavigationLink移至最外层,添加修饰符 NavigationLink(destination: AllM4Hole11View(scoreManager: scoreManager, course: course), tag: "Hole11", selection: $selection) { EmptyView() } .isDetailLink(false) } .navigationBarBackButtonHidden(true) .navigationBarItems(leading: Button(action: { self.mode.wrappedValue.dismiss() }){ Text("<< Back To Hole No \(course.hole10no)") .foregroundColor(ColorManager.Purple) }) }
补充说明
该问题在Xcode 13及更高版本配套的iOS 15+ SDK中已经被官方修复,如果项目最低兼容版本可以升级到iOS 15,直接更新开发工具即可彻底解决问题。
内容的提问来源于stack exchange,提问作者ColinL
相关产品推荐
相关产品推荐

