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

Segue传递旧数据求助:为何无法传递API获取的新idForPlace值?

问题原因及解决办法

核心问题:局部变量覆盖了成员变量

你在mapView(_:didTap:)方法里重新声明了一个局部的idForPlace:

var idForPlace = (data?["id"])!

这个变量和类顶部的成员变量var idForPlace = "test"是完全独立的两个变量——你修改的只是局部变量,类的成员变量根本没被更新,所以prepare(for:sender:)里拿到的始终是初始值"test"。

解决步骤

  1. 修正变量赋值逻辑
    去掉局部变量的var声明,直接给类的成员变量赋值:

    // 移除var,通过self明确访问成员变量
    self.idForPlace = (data?["id"])!
    

    这样成员变量就会被更新为从marker的userData里拿到的新值,segue传递时就能获取到正确数据。

  2. 可选优化:避免依赖成员变量
    你也可以不用成员变量,直接把目标ID通过sender传递给prepare(for:sender:),逻辑更清晰:

    // 在Firebase回调里传递placeId作为sender
    if let data = marker.userData as? [String:String], let placeId = data["id"] {
        let ref = Database.database().reference()
        ref.child("placeID/\(placeId)").observeSingleEvent(of: .value, with: { (snapshot) in
            self.performSegue(withIdentifier: "Fenster1", sender: placeId)
        })
    }
    

    然后修改prepare方法:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "Fenster1", 
           let destinationVC = segue.destination as? ViewComments,
           let placeId = sender as? String {
            destinationVC.idForPlace = placeId
        }
    }
    
  3. 额外提示:避免强制解包
    不要用!强制解包data?["id"],建议用可选绑定避免崩溃:

    if let data = marker.userData as? [String:String], let placeId = data["id"] {
        // 后续逻辑
    } else {
        print("Marker的userData格式错误或缺少id字段")
        return
    }
    

内容的提问来源于stack exchange,提问作者submariner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:45:20