2016-06-14 1 views
1

Mon application est censée permettre aux utilisateurs d'afficher une liste de lieux (en tant qu'annotations) sur une carte et d'ajouter leurs propres emplacements personnalisés. Il utilise trois contrôleurs de vue avec un contrôleur de navigation: une vue de table pour la liste des lieux, un contrôleur de vue de base avec une vue cartographique pour la carte et un contrôleur de vue de base avec un champ de texte pour ajouter un nom. Conseil de l'histoire:Déclenchement de push segue à partir d'une pression longue sur la carte

Story Board view

Le problème se produit avec le Segue mis en évidence à partir du contrôleur de vue sur la carte du contrôleur de vue Ajouter une étiquette. J'ai essayé de configurer de sorte que lorsqu'un utilisateur appuie longtemps sur l'affichage de la carte pendant plus d'une seconde, il se connecte manuellement au contrôleur de vue d'étiquette d'ajout, en utilisant la latitude et la longitude d'envoi de prepareForSegue. Cependant, lorsque j'exécute le long appui sur le simulateur, il semble se connecter deux fois. Le bouton de navigation de l'écran supérieur indique simplement "Retour", ce qui conduit à une copie de l'écran Ajouter une étiquette avec un bouton de navigation menant correctement au contrôleur de la carte.

Code pour appui long geste de reconnaissance de viewDidLoad:

var uilpgr = UILongPressGestureRecognizer(target: self, action:  "action:") 

    uilpgr.minimumPressDuration = 1 

    map.addGestureRecognizer(uilpgr) 
code

pour "action" déclenché par pression prolongée:

func action(gestureRecognizer:UIGestureRecognizer) { 

    touchPoint = gestureRecognizer.locationInView(self.map) 

    newCoordinate = map.convertPoint(touchPoint!, toCoordinateFromView: self.map) 
//3 
    self.performSegueWithIdentifier("NamePlace", sender: self) 
//4 
    } 

Code de préparation pour Segue (pour envoyer les coordonnées:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "NamePlace" { 

     let lat = newCoordinate!.latitude 
     let long = newCoordinate!.longitude 

     let viewController = segue.destinationViewController as! AddLabelViewController 

     viewController.latitude = lat 
     viewController.longitude = long 

    } 
} 

J'ai essayé de définir des points d'arrêt à 3 et 4 dans le code "action" (ainsi que pendant la pré méthode pareForSegue) et il semble que le code "action" ait été exécuté deux fois avant de déclencher les segues, qui se sont ensuite déroulées l'une derrière l'autre.

Quelqu'un peut-il expliquer pourquoi cela se produit et comment le réparer? (Je suis également ouvert aux suggestions de meilleurs moyens d'accomplir la tâche de nommer les points personnalisés abandonnés). Merci!

Répondre

0

Essayez de changer votre méthode d'action comme celui-ci

func action(gestureRecognizer:UIGestureRecognizer) { 

    if (gestureRecognize.state == .Began) { 
     touchPoint = gestureRecognizer.locationInView(self.map) 
     newCoordinate = map.convertPoint(touchPoint!, toCoordinateFromView: self.map) 
     self.performSegueWithIdentifier("NamePlace", sender: self) 
    } 
} 

Espérons que cela vous aidera.

+0

Cela a fonctionné. Je vous remercie! – MontanaCoder23