1

Я пытаюсь передать координаты, заголовок и субтитры выбранной MKAnnotation из ViewController1 (VC1) в ViewController2 (VC2), когда нажата кнопка DetailDisclosure rightCalloutAccessoryView. У меня есть segue от VC1 до VC2 с идентификатором viaSegue. У меня есть метка с идентификатором viaSegueLabel в VC2, где я хочу отображать координаты как String.Передача координат выбранной аннотации в новый контроллер просмотра Swift 2.0

Функция, которая адаптирует призыв MKAnnotation в таким образом, чтобы он отображает кнопку DetailDisclosure в rightCalloutAccessoryView выглядит следующим образом:

// Customize Annotation Callout 
    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
     // 1 
     let identifier = "Capital" 

     // 2 
     if annotation.isKindOfClass(Capital.self) { 
      // 3 
      var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) 

      if annotationView == nil { 
       //4 
       annotationView = MKPinAnnotationView(annotation:annotation, reuseIdentifier:identifier) 
       annotationView!.canShowCallout = true 

       // 5 
       let btn = UIButton(type: .DetailDisclosure) 
       annotationView!.rightCalloutAccessoryView = btn 
      } else { 
       // 6 
       annotationView!.annotation = annotation 
      } 

      return annotationView 
     } 

     // 7 
     return nil 
    } 

Функция, которая принимает пользователя от VC1 к VC2, когда кнопка DetailDisclosure сливают выглядит как :

// When righCalloutAccessoryView is tapped, segue to newView 
func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 
    self.performSegueWithIdentifier("newView", sender: view) 
} 

И функция Я думаю, что нужно реализовать для достижения этой цели выглядит следующим образом:

// Pass data to newView 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == "newView") { 
     let destViewController:BusStopSettingsViewController = segue.destinationViewController as! BusStopSettingsViewController 
     destViewController.viaSegue = // not sure how to reference selected Annotation here 
    } 
} 

В последней строке prepareForSegue() мне нужно указать MKnnotation, которая в данный момент выбрана. Есть ли метод, встроенный в Swift, который позволяет мне это делать, или я должен сделать Annotation глобальным?

ответ

0

Был в состоянии понять это на случай, если кто-то в будущем должен реализовать что-то подобное.

self.performSegueWithIdentifier("newView", sender: view) 

программно перетекает программу в View Controller (VC), который подключен к ВК вы в настоящее время через Segue с идентификатором "newView". Перед тем, как он полностью перейдет, программа вызывает prepareForSegue(). Эта функция - это то, где вы будете обрабатывать отправку информации в VC, к которому вы переходите. Моя проблема была в том, что я точно не знал, что я отправляю (с точки зрения типа, имени переменной и т. Д.). Если вы заметили, prepareForSegue() и self.performSegueWithIdentifier("newView", sender: view) оба имеют параметр отправитель. То, что вы отправляете с использованием performSegueWithIdentifier(), будет передано в prepareForSegue() и будет получено в вашем destinationViewController переменной с именем viaSegue. Это не стандартное имя, это именно то, что я выбрал, чтобы назвать эту переменную, и если вы изучите вышеприведенный код, вы увидите, где он используется и как он работает.

Итак, я хотел отправить информацию о MKAnnotation, которую я использовал. Итак, мне нужно было отправить объект типа MKAnnotationView на мой получающий VC «BusStopSettingsViewController» (BSSVC). В BSSVC мне нужна переменная под названием «viaSegue» типа MKAnnotationView. Чтобы отправить BSSVC объект типа MKAnnotationView мне нужно сделать

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if (segue.identifier == "newView") { 
     // pass data to next view 
     let destViewController:BusStopSettingsViewController = segue.destinationViewController as! BusStopSettingsViewController 
     destViewController.viaSegue = sender as! MKAnnotationView 
    } 
} 

Обратите внимание, как viaSegue указан в качестве переменной, которая будет получать этот объект.

Надеюсь, это поможет!