#ios #swift #mapkit #mapkitannotation
#iOS #swift #mapkit #mapkitannotation
Вопрос:
У меня возникают проблемы с отображением аннотаций на карте. Они отображаются только при перемещении или перетаскивании карты.
Я пытался следовать руководству на YouTube, а также одному из вопросов, который является c sharp
Пожалуйста, может ли кто-нибудь помочь.. вот код
Здесь я создал класс для аннотации
class customPin: NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
init(pinTitle:String, pinSubTitle:String, location:CLLocationCoordinate2D) {
self.title = pinTitle
self.subtitle = pinSubTitle
self.coordinate = location
}}
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
mapView.register(CustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
self.locationManager.requestWhenInUseAuthorization()
//json show the list of the parks
pipiCanList()
//show location Barcelona
let location = CLLocationCoordinate2D(latitude: 41.3851 , longitude:2.1734)
let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
self.mapView.setRegion(region, animated: true)
self.mapView.delegate = self
}
получить информацию в формате json
func pipiCanList(){
let url = "http://bluewave.lk/Apps/pipiCan/Api/read.php";
let urlObj = URL(string:url);
URLSession.shared.dataTask(with: urlObj!) {(data, response, error) in
do{
let pipiCans = try JSONDecoder().decode([pipiCanDBList].self, from: data!)
for pipiCan in pipiCans{
let Latitude = (pipiCan.ParkLatitude! as NSString).doubleValue
let Longitude = (pipiCan.ParkLongitude! as NSString).doubleValue
let location = CLLocationCoordinate2D(latitude: Latitude, longitude: Longitude)
//add to
let pin = customPin(pinTitle: pipiCan.ParkName!, pinSubTitle: pipiCan.Area!, location: location)
self.mapView.addAnnotation(pin)
}
} catch{
print ("Error - cannot get list")
}
}.resume()
}
}
Ответ №1:
Вам нужно
DispatchQueue.main.async {
let pin = customPin(pinTitle: pipiCan.ParkName!, pinSubTitle: pipiCan.Area!, location: location)
self.mapView.addAnnotation(pin)
}
Поскольку URLSession.shared.dataTask
обратный вызов выполняется в фоновом потоке, и вы должны получить доступ к элементам UIKit, подобным mapView
элементам основного потока, вы также можете сделать
self.mapView.showAnnotations(self.mapView.annotations, animated: true)
после цикла for для отображения всех добавленных аннотаций также имейте в виду, что вы задаете здесь регион
let location = CLLocationCoordinate2D(latitude: 41.3851 , longitude:2.1734)
let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05))
что ответ может быть со значениями местоположения, отличными от указанного выше региона
Комментарии:
1. Спасибо Sh_Kahn за ваш быстрый ответ. DispatchQueue.main.async сработал. Большое спасибо