Найти выбранный идентификатор карты MapKit. - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь установить выбранный идентификатор аннотации MapKit (mapEventID в моем случае) на didSelect и использовать, когда Swift готовит переход:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   let postViewVC = segue.destination as! PostView
   postViewVC.eventID = mapEventID
}

mapEventID инициализируется в обозревателе GeoFire:

func retrieveAllEvents () {

    let postDB = Database.database().reference().child("DBName")

    postDB.observe(.childAdded) { (snapshot) in

        let snapshotValue =  snapshot.value as! Dictionary <String,AnyObject>
        let postTitle = snapshotValue ["EventTitle"]!
        let postLocation = snapshotValue ["VisibleLocation"]!
        let eventID = snapshotValue ["EventID"]
        let postTime = snapshotValue ["EventDateTimeStart"]!

        let date = self.convertTimestamp(serverTimestamp: postTime as! Double)
        let mapEventDetails : String  = "\(date) - \(postLocation)"

        self.geoFire.getLocationForKey(locationID! as! String) { (location, error) in
            if (error != nil) {
                print("An error occurred getting the location for eventID:", eventID as Any)

            } else if (location != nil) {

                let postLat = location?.coordinate.latitude
                let postLong = location?.coordinate.longitude
                let coordinate = CLLocationCoordinate2D(latitude: postLat!, longitude: postLong!)
                let annotation = EventAnnotation (coordinate: coordinate, withKey: eventID as! String, title: mapEventDetails, subtitle: mapEventDetails)

                self.mapEventID = annotation.eventKey
                self.eventMap.addAnnotation(annotation)

            } else {
                print("GeoFire does not contain a location for:", eventID as Any)
            }
        }
    }
}

Проблема заключается в том, что он всегда использует самый последний добавленный идентификатор записи в качестве mapEventID, а не тот, который пользователь фактически нажал.Это имеет смысл, потому что, когда идентификаторы извлекаются из Firebase через наблюдателя, он «наблюдает» за всеми ключами, и самый последний из них становится идентификатором.

Как получить специфичный mapEventID, когда пользователь нажимает на аннотацию?На данный момент у меня есть:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    mapEventID = //How do I change the EventID here?
} 

Я надеялся, что смогу добавить идентификатор к свойству аннотации Description 'в наблюдателе Geofire, но Swift не предоставляет никакого синтаксиса для этого в:

let annotation = EventAnnotation (coordinate: coordinate, withKey: eventID as! String, title: postTitle, subtitle: eventDetails)

1 Ответ

0 голосов
/ 27 ноября 2018

Попробуйте следующий код:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    if let annotation = view.annotation as? EventAnnotation {
        mapEventID = annotation.eventKey
    }
} 
...