Ich versuche eine Karten-App zu erstellen, die Benutzereingaben von Längen- und Breitenkoordinaten erhalten kann, wenn Pin auf einer Karte in einer anderen Registerkarte platziert wird. Mein FirstVC besteht aus einer Schaltfläche "Orte hinzufügen", die zu OtherVC führt, in die der Benutzer die Koordinaten eingeben kann. SecondVC besteht aus dem MapView. Meine anfängliche Idee ist, ein spezifisches Koordinatenfeld zu haben, und alle neuen Koordinaten werden an dieses Feld angehängt. Die Ausführung fehlt mir, weil ich nicht sicher bin, wie ich dieses Array auf MapView übertragen soll. Hier ist, was ich bisher:Swift MKMapViewDelegate - Übertragen von Koordinaten zwischen den View-Controllern
Für die Eingabe von Koordinaten:
import UIKit
import CoreLocation
class OtherVC: UIViewController {
@IBOutlet weak var latitudeField: UITextField!
@IBOutlet weak var longitudeField: UITextField!
var coordinates = [CLLocationCoordinate2D]()
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func addToMap(_ sender: Any) {
let lat = Double(latitudeField.text!)
let long = Double(longitudeField.text!)
self.coordinates.append(CLLocationCoordinate2D(latitude: lat!, longitude: long!))
}
}
Für die MapView:
import UIKit
import MapKit
class MapViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
var coordinates = [CLLocationCoordinate2D]() {
didSet {
// Update the pins
// Since it doesn't check for which coordinates are new, it you go back to
// the first view controller and add more coordinates, the old coordinates
// will get a duplicate set of pins
for (index, coordinate) in self.coordinates.enumerated() {
let annotation = MKPointAnnotation()
annotation.coordinate = coordinate
annotation.title = "Location \(index)"
mapView.addAnnotation(annotation)
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let identifier = "pinAnnotation"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true
}
annotationView?.annotation = annotation
return annotationView
}
}
Ich habe eine Break-Anweisung in die if-let-Anweisung eingefügt, und es sieht so aus, als ob die Koordinaten ausgeführt und übertragen werden. Allerdings bekomme ich einen Fehler mit "mapView.addAnnotation (Annotation)", wenn ich die Koordinaten in mapViewController erhalte. Nicht ganz sicher, was das Problem ist. – Kevin
Können Sie Ihren Fehler ?, Denken Sie daran, dass CLLocation2D keine Float-Nummer ist, müssen Sie überprüfen, ob gültig ist, kann ich meine Antwort verbessern, wenn Sie –
Ich bekomme den Fehler "Thread 1: EXC_BAD_INSTRUCTION" .. Könnte dies verwandt sein die Art der Nummer in ClLocation2D? – Kevin