2017-09-06 2 views
0

so habe ich gelernt, iOS und für meine Praxis für MapKit, habe ich eine App, die in meiner Region zoomt und setzt eine PIN auf meine Ort (Geo-Koordinaten zum Simulator gegeben), das scheint alles zu funktionieren und ich kann sogar den Pin sehen ...iOS Swift MapKit, Pins von der Suche hinzugefügt Callback-Handler nicht auf der Karte

Aber als nächstes suche ich nach Geschäften in der Nähe mit 'Shop' Keyword und Ausdrucken der Namen des Suchelements im Callback-Handler scheinen sie zu zeigen. Aber die Pins für diese sind nicht auf der Karte.

Ich googelte einige, die mapView (mapView: viewFor:) -> MKAnnotation scheint nicht eine faule Funktion zu sein, die aus der Warteschlange und machen neue MKPinAnnotationView Objekte und sie zurückgeben .... Der Grund, warum ich für faul war wenn ich die Namen jedes Stiftes drucke, der von innen zurückgegeben wird, zeigt es nichts gedruckt, aber wenn ich einen Haltepunkt dort einfüge, wird es es dann zeigen ...

Anders als das, zuerst mal das Pins zeigten, also weiß ich, dass der Code zum Hinzufügen von ihnen funktioniert, aber dann habe ich Titel zu jedem Pin hinzugefügt, jetzt weiß ich nicht, ob es lange dauert, sie zu suchen und die App beendet ihre Arbeit bis dahin oder etwas oder nicht ...

importieren Ameisenbits aus dem Code:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    locationManager.delegate = self 
    mapView.delegate = self 

    if CLLocationManager.authorizationStatus() == .notDetermined { 
     self.locationManager.requestWhenInUseAuthorization() 
    } 

    locationManager.distanceFilter = kCLDistanceFilterNone 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.startUpdatingLocation() 

} 


func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    manager.stopUpdatingLocation() 
    locationManager.delegate = nil 
    centerMapOnLocation(location: manager.location!) 

    // Searching for shops 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = "Shop" 
    request.region = mapView.region 

    let search = MKLocalSearch(request: request) 

    search.start(completionHandler: {(response, error) in 
     if error != nil { 
      print("Error occured in search: \(error!.localizedDescription)") 
     } else if response!.mapItems.count == 0 { 
      print("No matches found") 
     } else { 
      print("Matches found") 

      for item in response!.mapItems { 
       let shopPin = MKPointAnnotation() 
       shopPin.coordinate = item.placemark.coordinate 
       shopPin.title = item.name 
       self.mapView.addAnnotation(shopPin) 
       print("Name = \(item.name!)") 
       //print(shopPin.title) 
      } 
         } 
    }) 



    // Putting a pin on current location 
    let homePin = MKPointAnnotation() 
    homePin.coordinate = (manager.location?.coordinate)! 
    homePin.title = "BitSol Technologies" 
    mapView.addAnnotation(homePin) 

} 


func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

    let pinIdent = "Pin"; 
    var pinView: MKPinAnnotationView; 
    if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: pinIdent) as? MKPinAnnotationView { 
     dequeuedView.annotation = annotation; 
     pinView = dequeuedView; 
    }else{ 
     pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: pinIdent); 
    } 
    if annotation.coordinate.latitude == locationManager.location!.coordinate.latitude && annotation.coordinate.longitude == locationManager.location!.coordinate.longitude{ 
     pinView.pinTintColor = MKPinAnnotationView.redPinColor(); 
    }else{ 
     pinView.pinTintColor = MKPinAnnotationView.purplePinColor() 
    } 
    pinView.canShowCallout = true 
    print(annotation.title!) 
    return pinView; 
} 
+0

ich Ihren Code versucht. dann erscheinen die Pins. https://i.stack.imgur.com/4mQ8o.png –

+0

Nun, meine Suchergebnisse kommen 1-2 Sekunden später als wenn der Titel des aktuellen Standort-Pins druckt .... kann es daran liegen oder so? –

Antwort

0

Vielleicht MKLocalSearch Vervollständigungshandler nicht auf Hauptthread ausgeführt. Versuchen Sie, den folgenden Code:

let search = MKLocalSearch(request: request) 
    search.start(completionHandler: {(response, error) in 
     // Go back to the main thread to update the UI 
     DispatchQueue.main.async { 
      if error != nil { 
       print("Error occured in search: \(error!.localizedDescription)") 
      } else if response!.mapItems.count == 0 { 
       print("No matches found") 
      } else { 
       print("Matches found") 

       for item in response!.mapItems { 
        let shopPin = MKPointAnnotation() 
        shopPin.coordinate = item.placemark.coordinate 
        shopPin.title = item.name 
        self.mapView.addAnnotation(shopPin) 
        print("Name = \(item.name!)") 
        //print(shopPin.title) 
       } 
      } 
     } 
    }) 
+0

Ich überprüfte, aber es änderte nichts ... Ashok Kumar Reddy Polus Antwort hilft ein wenig, aber nicht vollständig, es setzt die Stifte auf die südlichste Stadt in meinem Land (wilde Vermutung ist das, wo meine IP durchgeht, muss etwas damit haben) ... Eine weitere Sache, die ich hervorheben sollte, der locationManager (manager: didUpdateLocations :) wurde mehrmals aufgerufen, also musste ich den locationManager = nil machen, könnte das etwas damit zu tun haben? –

0

Rufen Sie diese Codezeile nach dem Hinzufügen alle Anmerkungen auf der Karte,

self.mapView.showAnnotations(self.mapView.annotations, animated: true) 
+0

Es funktioniert in der Anzeige der Pins, aber vor allem seine zeigt sie in der südlichsten Stadt in meinem Land, sehr weit weg von wo mein Benutzer Standort Pin ist (ich überprüfe auf Emulator mit Geo-Koordinaten gesetzt). manchmal funktioniert es gut, aber nicht immer. Meine wilde Vermutung ist, dass meine IP-Spuren durch diese Stadt ziehen, bevor sie das Land verlassen, könnte etwas damit zu tun haben, weil ich an keine andere Erklärung mit dem Wissen denken kann, das ich habe. Außerdem habe ich die Codezeile, die Sie angegeben haben, an das Ende des Completion-Handlers gesetzt, dessen was zuletzt ausgeführt wird, weil die Suche mehr Zeit in Anspruch nimmt. sollte ich es bewegen? –

+0

Was wäre der bessere Ansatz dafür? –

Verwandte Themen