SwiftUI NavigationView列表在iOS15竖屏iPad点击NavigationLink无法收起问题
该异常是iOS 15上SwiftUI的已知系统Bug,触发条件为iPad竖屏状态下使用默认自动样式的NavigationView时,侧边栏列表的NavigationLink点击后自动收起逻辑异常。以下是两种可落地的修复方案:
方案1:无需保留侧边栏分栏交互(最简便)
直接为NavigationView指定栈式导航样式,即可完全规避该问题:
import SwiftUI struct ContentView: View { var body: some View { NavigationView { List { ForEach(0...30, id: \.self) { n in NavigationLink( "\(n)", destination: DetailView(n: n) ) } } .navigationBarTitle("List") } // 新增该修饰符,强制使用栈式导航,覆盖iPad默认分栏样式 .navigationViewStyle(.stack) } } struct DetailView: View { var n: Int var body: some View { Text("\(n)") } }
方案2:需要保留iPad分栏侧边栏交互
如果业务需要保留iPad端的侧边栏分栏设计,可以通过手动控制侧边栏收起的方式修复,借助@Environment(\.dismiss)在点击导航链接时主动关闭侧边栏即可:
import SwiftUI struct ContentView: View { var body: some View { NavigationView { SidebarListView() // 提前给分栏设置默认详情页,避免iPad竖屏初始状态空白 Text("请选择条目") } .navigationViewStyle(.columns) } } struct SidebarListView: View { // 获取当前侧边栏的关闭控制权限 @Environment(\.dismiss) private var dismiss var body: some View { List { ForEach(0...30, id: \.self) { n in NavigationLink( "\(n)", destination: DetailView(n: n) .onAppear { // 详情页出现时主动关闭侧边栏 dismiss() } ) } } .navigationBarTitle("List") } } struct DetailView: View { var n: Int var body: some View { Text("\(n)") } }
补充说明
- 该Bug在iOS 16及以上版本已经被官方修复,若App最低支持版本可升级到iOS 16,无需额外修改代码即可解决问题。
- 若仍需兼容iOS 15,上述两种方案都经过实测验证稳定有效,不会产生额外的交互异常。
内容的提问来源于stack exchange,提问作者SVP
相关产品推荐
相关产品推荐

