Ios 如何传递 google 将 userData 映射到下一个视图

Ios how to pass google map userData to next view

我正在尝试在用户点击自定义信息 window 时将 google 地图的 userData 传递到下一个视图。

首先我像这样创建模型对象。

import UIKit
import Firebase

    struct Team {

        var key: String
        var teamName: String
        var league: String
        var lat: Double
        var lng: Double

        init(snapshot: DataSnapshot) {

            self.key = snapshot.key
            self.teamName = (snapshot.value as! NSDictionary)["teamName"] as? String
            self.league = (snapshot.value as! NSDictionary)["league"] as? String ?? ""
            self.lat = (snapshot.value as! NSDictionary)["lat"] as? Double ?? 0
            self.lng = (snapshot.value as! NSDictionary)["lng"] as? Double ?? 0
        }
    }

我获取了数据库并像这样 userData

var teams = [Team?]()

    func fetchTeams(){

            let teamRef = Database.database().reference().child("teams")
            teamRef.observe(.value, with: { (snapshot) in
                var result = [Team]()

                for child in snapshot.children {
                    let child = Team(snapshot: child as! DataSnapshot)
                    result.append(child)
                    self.teams = result
                }

                for team in self.teams {
                    guard let lat = team?.lat else { return }
                    guard let lng = team?.lng else { return }
                    let marker: GMSMarker = GMSMarker()
                    marker.position = CLLocationCoordinate2DMake(lat, lng)
                    marker.map = self.mapView
                    marker.userData = team
                }

            }, withCancel: nil)
        }

这个 func 工作得很好所以我猜 userData 有它的 属性 正确。

func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
            let infoWindow = Bundle.main.loadNibNamed("Marker", owner: self, options: nil)?.first as! MarkerView

            infoWindow.teamLabel.text = (marker.userData as! Team).teamName

            return infoWindow
        }


func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
        self.performSegue(withIdentifier: cellId, sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == cellId {
            let next: NextViewController = segue.destination as! NextViewController
            let marker = GMSMarker()
            next.team = marker.userData as? Team
        }
    }

我像上面那样实现了将数据传递给 NextViewController。 它工作正常,直到 performSeguenext.team 为零。有谁知道为什么? 提前致谢!

您遇到这个问题是因为您正在创建一个空的 GMSMarker,当然这个空的 GMSMarker 没有任何用户数据,您必须将选定的 GMSMarker 作为performSegue 中的参数,特别是 sender 参数中的参数,并将其转换为 Team 并将其传递给您的 NextViewController

func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
        self.performSegue(withIdentifier: cellId, sender: marker.userData)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == cellId {
            let next: NextViewController = segue.destination as! NextViewController
            if let teamData = sender as? Team{
               next.team = teamData
               debugPrint("teamData is fine")
            }
            debugPrint("segue identifier is correct")
        }
    }