2017-05-25 2 views
1

Mon programme utilise map et j'ai un UITextField où l'utilisateur entre une phrase de recherche, la carte affichera alors les annotations des résultats de la recherche sur la carte. Le programme fonctionne très bien dans le simulateur, mais lorsqu'il est testé sur mon téléphone, il lance une erreur «zéro pendant le déballage d'une valeur optionnelle» si j'entre deux travaux tels que «parc de chien». Mais le programme ne va pas jeter l'erreur sur mon téléphone si je viens d'entrer "chien" par exemple. J'ai le délégué mis en place dans le ViewDidLoad et tous mes points de vente sont correctement liés. J'ai cherché ici et essayé de résoudre le problème en vain, alors j'ai pensé que je demanderais et voir si vous les gars remarquez ce qui me manque.Swift UIText Champ de lancer une erreur nulle lorsque plusieurs mots sont entrés

est ici la fonction pour la recherche UITextLabel:

@IBAction func searchField(_ sender: UITextField) { 
    let allAnnotations = self.mapView.annotations 
    self.mapView.removeAnnotations(allAnnotations) 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = textField.text! 
    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{ 
      self.textField.text = "No matches found" 
     }else{ 
      print("Matches found") 
      for item in response!.mapItems{ 
       let annotation = MKPointAnnotation() 
       annotation.coordinate = item.placemark.coordinate 
       annotation.title = item.name 
       annotation.subtitle = item.placemark.thoroughfare! + ", " + item.placemark.locality! + ", " + item.placemark.administrativeArea! 
       self.mapView.addAnnotation(annotation) 
      } 
     } 
    }) 
    sender.resignFirstResponder() 
} 
+1

Sur quelle ligne l'erreur se produit-elle? Vous devriez envisager de déballer vos options en utilisant 'guard let' ou' if let' au lieu de forcer le déballage avec '!'. Cela peut vous aider à comprendre où les choses vont mal aussi bien. –

+0

Essayé cela et il a encore jeté l'erreur. Passé à travers le code dans le débogueur et il renvoie l'erreur après la ligne "self.mapView.addAnnotation". Ce qui est vraiment bizarre, c'est que si vous entrez un mot, c'est bien, mais deux et il y a une erreur. Sans oublier que cela fonctionne parfaitement en simulateur. – oblagon

+1

sur quelle ligne vous obtenez erreur? –

Répondre

0

Alors après avoir regardé dans ce plus j'ai trouvé une réponse qui ne nécessite pas d'ajouter à la chaîne naturalLanguageQuery. Le problème était que la boucle for renvoyait une valeur nulle. Mettre un garde laisse entrer la réponse a résolu.

@IBAction func searchField(_ sender: UITextField) { 
    let allAnnotations = self.mapView.annotations 
    self.mapView.removeAnnotations(allAnnotations) 
    let request = MKLocalSearchRequest() 
    request.naturalLanguageQuery = textField.text! 
    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{ 
      self.textField.text = "No matches found" 
     }else{ 
      print("Matches found") 
      guard let response = response?.mapItems else { return } 
      for item in response{ 
       let annotation = MKPointAnnotation() 
       annotation.coordinate = item.placemark.coordinate 
       annotation.title = item.name 
       annotation.subtitle = item.placemark.thoroughfare! + ", " + item.placemark.locality! + ", " + item.placemark.administrativeArea! 

       self.mapView.addAnnotation(annotation) 
      } 
     } 
    }) 
    sender.resignFirstResponder() 
}