代码之家  ›  专栏  ›  技术社区  ›  joshlorschy

通过序列将数据从地图标注中的detailDisclosure按钮传递到新的DetailView

  •  0
  • joshlorschy  · 技术社区  · 8 年前

    我使用JSON文件在MapView上填充了几个pin。每个插脚都正确显示一个带有标题、副标题、图像和详细信息披露按钮的标注。

    我试图在地图视图和细节视图(安排为表视图)之间创建一个分段,这样当用户单击detailDisclosure按钮时,他们就会进入细节视图屏幕。

    我创建的segue工作得很好,但是,我不知道如何传递数据。我如何才能成功地将数据传递到此序列,使其显示在细节视图中?请参阅下面的相关代码。

    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
        self.performSegue(withIdentifier: "toShowLocationDetail", sender: self)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toShowLocationDetail" {
            // I DON'T KNOW WHAT TO PUT IN HERE - I THINK THIS IS WHERE THE INFORMATION ABOUT THE DATA GOES
        }
    }
    

    我不确定您是否需要它,但这是我的ViewDidLoad方法(我用于解析JSON文件并填充注释:

    var locations = [Location]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // parse json
        if let locationJson = readLocation(){
            if let locationArray = locationJson["locations"] as? [[String:Any]]{
                for location in locationArray{
                    locations.append(Location.init(locationInfo: location))
                }
                print(locations.count)
            }
        }
        // end parse json
    
        nearMeMap.delegate = self
    
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
        self.nearMeMap.showsUserLocation = true
    
    
        // Show annotation
        for location in locations {
            let annotation = MKPointAnnotation()
            annotation.title = location.name
            annotation.subtitle = location.type
            annotation.coordinate = CLLocationCoordinate2D(latitude: location.latitude, longitude: location.longitude)
            self.nearMeMap.addAnnotation(annotation)
    
        }
    
    }
    

    DetailView中的变量集(当前使其能够显示TableView中的数据)为:

    var location:Location!
    

    编辑:

    class Location: NSObject {
        var id: String = ""
        var name: String = ""
        var type: String = ""
        var location: String = ""
        var image: String = ""
        var activity: String = ""
        var isVisited: Bool = false
        var rating: String = ""
        var latitude: Double = 0.0
        var longitude: Double = 0.0
    
        init(locationInfo:[String:Any]) {
            self.id = locationInfo["id"] as! String
            self.name = locationInfo["name"] as! String
            self.type = locationInfo["type"] as! String
            self.location = locationInfo["location"] as! String
            self.image = locationInfo["image"] as! String
            self.activity = locationInfo["activity"] as! String
            self.isVisited = locationInfo["isVisited"] as! Bool
            self.latitude = locationInfo["latitude"] as! Double
            self.longitude = locationInfo["longitude"] as! Double
        }
    
        public var coordinate: CLLocationCoordinate2D { get {
            let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
            return coordinate
            }
        }
    
    }
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   nayem    8 年前

    您必须跟踪选定的 Annotation coordinate 属性传递给DetailView prepare(for:sender:) 方法

    var selectedAnnotation: MKPointAnnotation?
    
    func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
        self.selectedAnnotation = view.annotation as? MKPointAnnotation
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let filteredLocations = locations.filter { (location) -> Bool in
            return (location.latitude == self.selectedAnnotation?.coordinate.latitude && location.longitude == self.selectedAnnotation?.coordinate.longitude)
        }
        let selectedLocation = filteredLocations.first
        if segue.identifier == "toShowLocationDetail" {
            let destinationViewController = segue.destination as! DetailView
            destinationViewController.location = selectedLocation
        }
    }
    

    在你的 DetailView var location: Location?