2016-07-28 28 views
0

Ich habe zwei verschiedene Pins auf meiner Mapview platziert. Ich habe eine Info-Taste an jedem. Die Info-Schaltflächen wechseln zu einem UIViewController, der eine Bildansicht (um ein Bild des Ortes aufzunehmen) und eine Textbeschriftung (um Informationen über den Ort zu halten) aufweist.Verschiedene Informationen für verschiedene Pin-Annotationen

Mein Problem ist, wie kann ich die Info und Bild abhängig davon, welche Pin Annotation Button ausgewählt wurde. Die letzte Funktion ist diejenige, die verwendet wird, um zum Info View Controller zu gelangen.

class GetToTheStart: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate { 
//map view outlet 
@IBOutlet weak var mapView: MKMapView! 

//defining use of location manager 
let myLocMgr = CLLocationManager() 




    override func viewDidLoad() { 
    super.viewDidLoad() 

    //setting up location request 
    myLocMgr.desiredAccuracy = kCLLocationAccuracyBest 
    myLocMgr.requestWhenInUseAuthorization() 
    myLocMgr.startUpdatingLocation() 
    myLocMgr.delegate = self 
    mapView.delegate = self 

    // coordinates of desired locations for pins 
    var zoo1 = CLLocationCoordinate2DMake(53.347439, -6.291820) 
    var town1 = CLLocationCoordinate2DMake(53.347247, -6.290865) 

    //setting up pin 1 annotation (the zoo) 
    var zoopin = MKPointAnnotation() 
    zoopin.coordinate = zoo1 
    zoopin.title = "Dublin Zoo" 
    zoopin.subtitle = "This this the zoo" 
    mapView.addAnnotation(zoopin) 

    //setting up pin 2 annotation (the town) 
    var townpin = MKPointAnnotation() 
    townpin.coordinate = zoo1 
    townpin.title = "Dublin town" 
    townpin.subtitle = "This this the town" 
    mapView.addAnnotation(townpin) 
} 


    //setting up Pin callout button for segue 
    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    if annotation is MKUserLocation { 
    } 
    let reuseIdentifier = "pin" 
    var pin = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseIdentifier) as? MKPinAnnotationView 
    if pin == nil { 
     pin = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier) 
     pin!.pinColor = .Red 
     pin!.canShowCallout = true 
     pin!.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure) 
    } else { 
     pin!.annotation = annotation 
    } 
    return pin 
} 



    //performing segue from info button to infoViewController 
    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 
    performSegueWithIdentifier("info", sender: view) 
} 
+0

Während Code geben, Format es auch sonst wird es sehr schwierig sein, durch sie gehen ... –

+0

Wenn Sie auf den Pin klicken Sie wissen müssen, um die Pin-Annotation entweder Stift mit dem Titel „Dublin Zoo“ geklickt wird oder "Dublin Stadt"? Ist das dein Problem? –

+0

hat es dort neu formatiert und ein paar Kommentare hinzugefügt, so dass es einfacher sein sollte, zu folgen. Ja, das Problem ist, dass ich nicht herausfinden kann, wie man Informationen über den angeklickten Pin (d. H. Entweder den Zoo-Pin oder den Stadt-Pin) an den infoViewController sendet. –

Antwort

1

Dafür müssen Sie unten Methode überschreiben. Hier erhalten wir die AnnotationView, die den Übergang auslöst.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "info") { 
     if let annotation = sender as? MKAnnotationView { 
      let detailViewController = segue.destinationViewController as! DetailViewController 
      detailViewController.titleText = annotation.annotation?.title ?? "" 
      detailViewController.detaileText = annotation.annotation?.subtitle ?? "" 
     } 
    } 
} 

Und im detailViewController ist die gleiche wie Ihre infoViewController und hier habe ich zwei Etiketten und dass ich zwei öffentliche Variablen. Dies dient nur dazu, Fehler zu vermeiden, da wir zu diesem Zeitpunkt keine Label-Objekte haben.

Hier ist der Code für meine DetailViewController.

import UIKit 

class DetailViewController: UIViewController { 

@IBOutlet weak var titleLabel: UILabel! 
@IBOutlet weak var detailLabel: UILabel! 


var titleText: String? { didSet { updateUI() } } 
var detaileText: String? { didSet { updateUI() } } 

override func viewDidLoad() { 
    super.viewDidLoad() 
    updateUI() 
} 

private func updateUI() { 
    self.titleLabel?.text = self.titleText 
    self.detailLabel?.text = self.detaileText 
} 
} 
+0

Danke, dass es sehr hilfreich ist, zwischen den verschiedenen Pins unterscheiden zu können. Allerdings werden auf diese Weise nur Titel und Untertitel gesendet. Gibt es eine Möglichkeit, einen Informationsabschnitt mit jedem Pin zu verbinden und diesen anzuzeigen? Ich dachte daran, den Untertitel nur als Informationsabschnitt zu definieren und ihn nur vor der Anmerkung zu verstecken. Was würden Sie davon halten? Ist es möglich, ein Bild mit jedem Pin mit dieser Methode zu verknüpfen? –

+0

Können Sie genauer sein .. Ich bekomme nicht –

+0

Cool. Okay, der von Ihnen gepostete Code ermöglicht es, den Titel und den Untertitel des ausgewählten Pins an den infoViewController zu senden. Das ist sehr hilfreich. Ich möchte jedoch einen Absatz über den ausgewählten Pin an den infoViewController senden, nicht nur den Titel und den Untertitel des Pins. Ich möchte auch ein Bild mit jedem Pin verbunden haben und in der Lage sein, dies an den infoViewController sowie den Absatz zu senden. –