Передать текст из MKMarkerAnnotation в другой контроллер представления - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь передать текст из моих маркеров в MKMapView другому контроллеру представления, когда маркеры касаются. Я попробовал использовать один метод после чтения онлайн, но так как контроллер представления, которому я передаю текст, не имеет контроллера навигации, я не думаю, что он будет работать. Обратите внимание, что я также использую Firebase для извлечения данных, которые будут отображаться на маркерах, и причина, по которой контроллер представления выглядит странно, заключается в том, что я использую ISHPullUp

Визуальное представление: https://imgur.com/a/zEW64aY

Код из TopViewController (данные MKMapView и MKMarker)

var mainTitle = ""

.

Database.database().reference().child("posts").observeSingleEvent(of: .value, with: { (snapshot) in
        for snap in snapshot.children {
            let postSnap = snap as! DataSnapshot
            if let dict = postSnap.value as? [String:AnyObject] {
                let title = dict["title"] as! String
                let locationName = dict["location"] as! String
                let discipline = dict["category"] as! String
                let coordinate = CLLocationCoordinate2D(latitude: dict["lat"] as! Double, longitude: dict["long"] as! Double)
                let artwork = Artwork(title: title, locationName: locationName, discipline: discipline, coordinate: coordinate)
                self.mapView.addAnnotation(artwork)
            }
        }
    })

.

extension TopViewController: MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard let annotation = annotation as? Artwork else { return nil }
        let identifier = "marker"
        var view: MKMarkerAnnotationView
        if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
            as? MKMarkerAnnotationView {
            dequeuedView.annotation = annotation
            view = dequeuedView
        } else {
            view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            mainTitle = annotation.title!
        }
        return view
    }

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        let myVC = storyboard?.instantiateViewController(withIdentifier: "bottom") as! BottomViewController // Didn't work
        myVC.stringPassed = mainTitle
        navigationController?.pushViewController(myVC, animated: true)
        print(mainTitle)
    }
}

Код из BottomViewController (View Controller, на который я пытаюсь отправить текст)

var stringPassed = ""

override func viewDidLoad() {
    super.viewDidLoad()

    toplabel.text = stringPassed
}

Код из ViewController

class ViewController: ISHPullUpViewController {
    private func commonInit() {
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let contentVC = storyBoard.instantiateViewController(withIdentifier: "content") as! TopViewController
        let bottomVC = storyBoard.instantiateViewController(withIdentifier: "bottom") as! BottomViewController
        contentViewController = contentVC
        bottomViewController = bottomVC
        bottomVC.pullUpController = self
        contentDelegate = contentVC
        sizingDelegate = bottomVC
        stateDelegate = bottomVC
    }
}

1 Ответ

0 голосов
/ 15 мая 2018

Вам необходимо реализовать didSelect метод делегата MKMapViewDelegate

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        if view.annotation is MKUserLocation {
            return
        }
        let ann = view.annotation as! Artwork
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let bottomVC = storyBoard.instantiateViewController(withIdentifier: "bottom") as! BottomViewController
        bottomViewController = bottomVC
        bottomVC.pullUpController = self
        sizingDelegate = bottomVC
        vc.stringPassed = ann.title
}

//

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    if segue.identifier == "bottom" {
      let nextScene =  segue.destination  as! BottomViewController 
      nextScene.stringPassed = sender as! String
    }
}

//

Также можно использоватьpush вместо segue embed TopViewController внутри UINavigationController

...