含@Environment(\.dismiss)的子视图中,NavigationLink内嵌ForEach导致点击无响应
问题场景
- 该异常仅在Xcode预览画布(Canvas)和模拟器中出现,iPhone真机运行无此问题
- 由于预览画布基于模拟器后台运行,推测可能是本地环境问题,计划通过重装Xcode排查
最小复现代码
import SwiftUI struct ContentView: View { var body: some View { VStack { NavigationStack { ChildView() } } .padding() } } struct ChildView: View { // 注释此行可修复问题 @Environment(\.dismiss) var dismiss var body: some View { VStack { NavigationLink("注释/取消注释@Environment") { ForEach(1...5, id: \.self) { index in Text("demo \(index)") } } } } } #Preview { ContentView() }
核心问题
在包含@Environment(\.dismiss) var dismiss的子视图中,若NavigationLink的目标视图内嵌套ForEach,会导致该NavigationLink在Canvas预览和模拟器中无法触发跳转。
疑问
- 我的代码是否存在编写错误?
- 这是否属于SwiftUI的已知Bug?
技术环境
- Swift版本:5
- iOS目标版本:17.4
- Xcode版本:15.3(15E204a)
回答
你的代码写法本身没有语法错误,完全符合SwiftUI的规范。
这种仅在预览/模拟器出现、真机正常的情况,大概率是Xcode 15.3和iOS 17.4模拟器组合的特定Bug:
- 从现象来看,
@Environment(\.dismiss)的注入逻辑,和NavigationLink+ForEach的组合触发了交互事件传递的异常,导致点击没有被正确响应 - 真机的运行逻辑和模拟器/预览画布存在底层差异,因此没有触发这个问题
可以尝试以下临时解决方案:
- 给ForEach外层包裹一个容器视图(比如
VStack或List),避免直接作为NavigationLink的目标内容:NavigationLink("注释/取消注释@Environment") { VStack { // 添加外层容器 ForEach(1...5, id: \.self) { index in Text("demo \(index)") } } } - 更新到Xcode的最新测试版本,确认是否已修复该问题
- 若重装Xcode后问题仍存在,可通过Apple的Feedback Assistant提交Bug反馈
内容的提问来源于stack exchange,提问作者vullnetyy
相关产品推荐
相关产品推荐

