2016-07-07 2 views
0

Я создаю приложение, которое позволяет людям публиковать аннотации на карте, и вы можете щелкнуть по закрытию детали аннотации и загрузить ViewController с изображением и информацией о субтитрах, но когда я пытаюсь загрузить изображение и подзаголовок в методе viewDidLoad в detailVC он говорит, что нольКак загрузить Viewcontroller с информацией о аннотации

Вот мой код Аннотация:

extension ViewController: MKMapViewDelegate { 

private struct Constants{ 
    static let identifier = "pin" 
    static let LeftCalloutFrame = CGRect(x:0, y:0, width: 59, height: 59) 
    static let ShowPinSegueIdentifier = "showDetail" 
} 

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    if let annotation = annotation as? PingAnnotation { 
     var view = mapView.dequeueReusableAnnotationViewWithIdentifier(Constants.identifier) as? MKPinAnnotationView 
     if view == nil { 
      view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: Constants.identifier) 
      view?.canShowCallout = true 
     } else { 
      view!.annotation = annotation 
     } 
     view!.calloutOffset = CGPoint(x: -5, y: 5) 
     view!.leftCalloutAccessoryView = UIImageView(frame: Constants.LeftCalloutFrame) 
     view!.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure) as UIView 
     return view 

    } 
    return nil 
} 

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { 
    if let thumbnailImageView = view.leftCalloutAccessoryView as? UIImageView { 
     if let pingAnnotation = view.annotation as? PingAnnotation{ 
      thumbnailImageView.image = pingAnnotation.image 
     } 
    } 
} 

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 
    performSegueWithIdentifier(Constants.ShowPinSegueIdentifier, sender: view) 
} 


} 

Аннотация код:

class PingAnnotation: NSObject, MKAnnotation { 

var coordinate : CLLocationCoordinate2D 
var title: String? 
var subtitle: String? 
var image : UIImage? 

init(coordinate: CLLocationCoordinate2D, title: String?, subtitle: String?, image: UIImage?) { 

    self.coordinate = coordinate 
    self.title = title 
    self.subtitle = subtitle 
    self.image = image 
} 
} 

Detail VC Код:

import UIKit 

class DetailPingVC: UIViewController { 

var ping : PingAnnotation! 


@IBOutlet var pingImage: UIImageView! 

@IBOutlet var pingDesc: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    pingImage.image = ping.image //shows as nil when ran 
    pingDesc.text = ping.subtitle //shows as nil when ran 


} 



    @IBAction func pingBtnPressed(sender: AnyObject) { 
} 

    @IBAction func backBtnPressed(sender: AnyObject) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 
} 

EDIT:

Я попытался с помощью prepareForSegue, но значения до сих пор выходят ноль

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let destViewController: DetailPingVC = segue.destinationViewController as! DetailPingVC 
    destViewController.pingImage.image = ping.image 
    destViewController.pingDesc.text = ping.subtitle 
} 
+0

Похоже, вы не реализуете prepareForSegue: там вы должны установить свойство ping DetailPingVC на соответствующее значение. – Remover

+0

Где я могу реализовать prepareForSegue? – Doba

+0

Посмотрите документы на UIViewController. В Интернете также должно быть множество примеров. – Remover

ответ

0

Понял! В основном то, что я сделал добавить переменную типа строки и переменную типа UIImage в DetailVC, а затем мой prepareForSegue в моей ViewController выглядит так:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let destViewController: DetailPingVC = segue.destinationViewController as! DetailPingVC 

    destViewController.descText = postTextField.text! 
    destViewController.detailImage = pickImage.image! 
} 

затем в viewDidLoad в деталях VC вы установите Outlets к ранее установленным переменным.

Смежные вопросы