2016-11-21 1 views
0

Je développe une application dans laquelle l'utilisateur doit marquer un emplacement sur une carte, puis l'enregistrer. Mon application l'archive ensuite, et lorsque l'utilisateur veut voir cet emplacement, l'application est censée récupérer les coordonnées du lieu, et ajouter une annonce sur la carte si les coordonnées existent. Voici le morceau de code que j'ai créé pour afficher les informations de l'utilisateurMa publication n'est pas visible lorsque je l'ajoute dans viewDidLoad de mon application

@IBOutlet var mapGestureRecognizer: UIGestureRecognizer! 
var item: itemData? 

// Item Outlets 
@IBOutlet weak var itemInfoView: UIView! 
@IBOutlet weak var itemNameTextField: UITextField! 
@IBOutlet weak var itemDescriptionLabel: UITextView! 
@IBOutlet weak var mapView: MKMapView! 

// Item Location Outlets 
@IBOutlet weak var itemLocationView: UIView! 
@IBOutlet weak var itemLocationTextView: UITextView! 

let dropPin = MKPointAnnotation() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.mapView.delegate = self 

    // Data loading 
    itemNameTextField.delegate = self 
    itemDescriptionLabel.delegate = self 
    itemLocationTextView.delegate = self 

    // Press recognizer 

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

     let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "myAnnotationView") 
     // configure the view 

     return annotationView 
    } 

    if let item = item { 

     itemNameTextField.text = item.itemName 
     itemDescriptionLabel.text = item.itemDescription 
     itemLocationTextView.text = item.itemPlace 

     dropPin.coordinate = mapView.convert(item.mapPoint, toCoordinateFrom: mapView) 
     dropPin.title = "Location of \(item.itemName)" 
     mapView.addAnnotation(dropPin) 
     print("Set the location of item pin to \(String(describing: dropPin.coordinate))") 


    } 

    // Styles 
    itemInfoView.layer.cornerRadius = 3 
    itemInfoView.layer.shadowColor = UIColor(red:0/255.0, green:0/255.0, blue:0/255.0, alpha: 1.0).cgColor 
    itemInfoView.layer.shadowOffset = CGSize(width: 0, height: 1.75) 
    itemInfoView.layer.shadowRadius = 1.7 
    itemInfoView.layer.shadowOpacity = 0.45 

    itemLocationView.layer.cornerRadius = 3 
    itemLocationView.layer.shadowColor = UIColor(red:0/255.0, green:0/255.0, blue:0/255.0, alpha: 1.0).cgColor 
    itemLocationView.layer.shadowOffset = CGSize(width: 0, height: 1.75) 
    itemLocationView.layer.shadowRadius = 1.7 
    itemLocationView.layer.shadowOpacity = 0.45 

    } 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 
let annotation = MKPointAnnotation() 
//let point = mapView.convert(coordinate, toPointTo: overlayView) 
func action(gestureRecognizer:UIGestureRecognizer){ 

    if let item = item { 
     dropPin.coordinate = mapView.convert((item.mapPoint), toCoordinateFrom: mapView) 
     dropPin.title = "Location of \(item.itemName)" 
     mapView.addAnnotation(dropPin) 
     print("Set the location of item pin to \(String(describing: dropPin.coordinate))") 
    } 

    else { 
     let itemName = itemNameTextField.text 
     let touchPoint = gestureRecognizer.location(in: mapView) 
     let newCoordinates = mapView.convert(touchPoint, toCoordinateFrom: mapView) 
     annotation.coordinate = newCoordinates 
     annotation.title = "Location of \(itemName!)" 
     mapView.addAnnotation(annotation) 
    } 

} 

@IBAction func mapLocationPress(_ sender: UILongPressGestureRecognizer) { 
     action(gestureRecognizer: mapGestureRecognizer) 

} 

Toutes les déclarations d'impression que j'ai créé le travail, donc je sais que l'application ne enregistrer les coordonnées, et qu'il est-ce que les convertit correctement. Cependant, lorsque l'application charge l'information dans la partie if let item = item du viewDidLoad, la broche n'est pas déposée sur la carte comme elle le devrait.

Est-ce que quelqu'un voit pourquoi mon code ne fonctionne pas comme il le devrait? Merci!

Si vous avez besoin de mon code complet, dites-le moi, et je le mettrai dans ma question.

+0

Mai Si la carte n'est pas chargée avant viewDidLoad, avez-vous essayé d'ajouter l'annotation dans viewDidAppear ou viewWillAppear? –

+0

Également mettre 'func mapViewFunc' hors de ViewDidLoad – Rajat

Répondre

1

Vous devez utiliser

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
     let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "myAnnotationView") 
     // configure the view 

     return annotationView 
} 

en dehors de votre viewDidLoad() fonction

+0

J'ai déplacé cette fonction en dehors de mon' viewDidLoad() ', mais la broche n'apparaît toujours pas quand l'écran se charge, bien que _does_ enregistre les coordonnées, et _does_ affecte les coordonnées à la broche. Serait-ce autre chose? –

+0

Qu'est-ce que vous obtenez ici - 'print (" Définir l'emplacement de l'élément broche sur \ (Chaîne (décrivant: dropPin.coordinate)) ") – Rajat

+0

Lorsque cette instruction est exécutée, xCode imprime' Définir l'emplacement de l'élément broche sur CLLocationCoordinate2D (latitude: 73.632655333854188, longitude: -104.16040759876424) '(ce sont les coordonnées de la broche que j'ai lâchée) –

0

Vous devriez mettre mapViewFunc de viewDidLoad, mais si vous voulez le laisser dans viewDidLoad

essayer

func viewDidLoad() { 
    super.viewDidLoad() 
    DispatchQueue.main.async { 
     // add pin 
    } 
}