NavigationLink随机弹回根视图报“Unable to present. Please file a bug.”如何修复
问题修复方案
这是iOS 14/15版本中SwiftUI的已知bug,多个绑定同一状态变量的编程式NavigationLink并列放在栈容器中时,系统会出现视图识别冲突,导致跳转异常回退并输出Unable to present. Please file a bug.报错。你查到的新增空NavigationLink的方案只适用于奇数个导航链接的特定场景,无法解决多个链接绑定同一选择变量的冲突问题,因此对你的场景无效。
方案1:合并为单个动态NavigationLink(兼容性最好,推荐)
你所有的NavigationLink都绑定了同一个$modelController.currentPage,完全可以合并为一个动态生成目标页的链接,从根源避免多链接冲突:
NavigationView { VStack { // 仅保留一个NavigationLink,根据当前页码动态生成目标页 NavigationLink( destination: buildDestination(for: modelController.currentPage) .background(Color.neutral(.oneHundred)) .navigationBarTitle("") .navigationBarHidden(true) .navigationBarBackButtonHidden(true), tag: modelController.currentPage ?? 0, selection: $modelController.currentPage, label: { EmptyView() } ) EventSetupDetailView() .background(Color.neutral(.oneHundred)) .navigationBarTitle("") .navigationBarHidden(true) .navigationBarBackButtonHidden(true) } } // 单独构建目标页的方法,用@ViewBuilder支持返回不同视图类型 @ViewBuilder private func buildDestination(for page: Int?) -> some View { switch page { case 1: EventSetupQueueSelectionView() case 2: EventSetupQueueDetailsView() case 3: EventSetupSigningView() case 4: EventSetupRetailView() case 5: EventSetupPrivacyView() case 6: EventSetupSummaryView() default: EmptyView() } }
方案2:保留多链接写法的修复
如果需要保留多个NavigationLink的写法,做两处改动即可修复:
- 给每个
NavigationLink添加.isDetailLink(false)修饰符,关闭多列适配的详情页逻辑,避免系统识别错误 - 将所有
NavigationLink放到ZStack底层,不要和可见视图并列放在VStack子节点中
NavigationView { ZStack(alignment: .topLeading) { // 所有导航链接放在ZStack最底层,不影响正常布局 ForEach(1..<7) { page in NavigationLink( destination: { switch page { case 1: EventSetupQueueSelectionView() case 2: EventSetupQueueDetailsView() case 3: EventSetupSigningView() case 4: EventSetupRetailView() case 5: EventSetupPrivacyView() case 6: EventSetupSummaryView() default: EmptyView() } }() .background(Color.neutral(.oneHundred)) .navigationBarTitle("") .navigationBarHidden(true) .navigationBarBackButtonHidden(true), tag: page, selection: $modelController.currentPage, label: { EmptyView() } ) .isDetailLink(false) // 关键修复修饰符 } VStack { EventSetupDetailView() .background(Color.neutral(.oneHundred)) .navigationBarTitle("") .navigationBarHidden(true) .navigationBarBackButtonHidden(true) } } }
方案3:适配iOS16+改用NavigationStack
如果你的应用最低支持版本为iOS 16及以上,直接替换为新的NavigationStack导航框架即可,该bug在新框架中已被官方修复:
// 需要先把modelController中的currentPage替换为NavigationPath类型,或者Int数组类型 NavigationStack(path: $modelController.navigationPath) { EventSetupDetailView() .background(Color.neutral(.oneHundred)) .navigationBarHidden(true) .navigationDestination(for: Int.self) { page in buildDestination(for: page) .background(Color.neutral(.oneHundred)) .navigationBarHidden(true) .navigationBarBackButtonHidden(true) } }
跳转时只需往navigationPath中添加对应的页码值即可触发导航。
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

