You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数据从MapAnnotation传递到fullScreenCover弹窗

问题根因

你当前使用的fullScreenCover(isPresented:content:)初始化方法存在闭包值捕获的特性:content闭包会在CourseMapView首次渲染时就捕获当时的selectedCourse值,后续selectedCourse更新时,已经生成的闭包不会自动刷新捕获的变量,所以你点击标注给selectedCourse赋值后再弹出的sheet,拿到的还是初始的nil值。

解决方案

推荐使用SwiftUI提供的专门适配可选值的fullScreenCover(item:content:)初始化方法,该方法会自动监听可选值的变化,当值不为nil时自动弹出sheet,同时会自动将解包后的值传入content闭包,从根源上避免值捕获异常的问题。

代码修改步骤:

  1. 删掉无用的@State var isShowSheet = false声明
  2. 修改onTapGesture内的逻辑,无需手动控制sheet的显示状态,直接给selectedCourse赋值即可:
.onTapGesture(count: 1, perform: {
    print("PRINT: \(course.name)")
    selectedCourse = course
    print("\(selectedCourse)")
})
  1. 替换原来的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:21:00