如何将数据从MapAnnotation传递到fullScreenCover弹窗
问题根因
你当前使用的fullScreenCover(isPresented:content:)初始化方法存在闭包值捕获的特性:content闭包会在CourseMapView首次渲染时就捕获当时的selectedCourse值,后续selectedCourse更新时,已经生成的闭包不会自动刷新捕获的变量,所以你点击标注给selectedCourse赋值后再弹出的sheet,拿到的还是初始的nil值。
解决方案
推荐使用SwiftUI提供的专门适配可选值的fullScreenCover(item:content:)初始化方法,该方法会自动监听可选值的变化,当值不为nil时自动弹出sheet,同时会自动将解包后的值传入content闭包,从根源上避免值捕获异常的问题。
代码修改步骤:
- 删掉无用的
@State var isShowSheet = false声明 - 修改
onTapGesture内的逻辑,无需手动控制sheet的显示状态,直接给selectedCourse赋值即可:
.onTapGesture(count: 1, perform: { print("PRINT: \(course.name)") selectedCourse = course print("\(selectedCourse)") })
- 替换原来的
fullScreenCover实现:
.fullScreenCover(item: $selectedCourse, content: { course in LocationInfoView(viewModel: LocationInfoViewModel(course: course)) })
如果需要在LocationInfoView内关闭sheet,无需自定义showingSheet环境变量,直接在LocationInfoView内声明@Environment(\.dismiss) private var dismiss,调用dismiss()方法即可关闭弹窗。
内容的提问来源于stack exchange,提问作者tonileipo
相关产品推荐
相关产品推荐

