Ich versuche, eine Suchleiste zu implementieren, wo der Benutzer eine Zeichenfolge eingeben und nach einer Adresse oder einem Geschäft suchen kann.Warum erhalte ich bei einer lokalen Suche einen MKErrorDomain-Fehler?
Unternehmen zu finden I Yelp APIs verwenden, um die Informationen die ich brauche auszulagern.
Adressen zu finden Ich benutze MKLocalSearch
APIs Apple die Informationen, die ich brauche zu bekommen.
Allerdings habe ich ein Problem. Wenn ich auf die Rücktaste halten, um den Text aus der Suchleiste zu löschen oder zu schnell in die Suchleiste eingeben Ich erhalte ein MKErrorDomain
Fehler:
The operation couldn’t be completed. (MKErrorDomain error 3.)
Wenn ich diesen Fehler werde ich warten müssen, ein paar Momente, damit der Code wieder funktioniert und Informationen von den APIs abgerufen werden kann.
Der folgende Code ist, was muss ich umsetzen, was ich suche:
Dies ist die Suchleiste Delegatmethode:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text == "" {
addServiceCellToTableView()
loadSearchHistory()
return
} else if searchBar.text != "" {
removeServiceCellFromTableView()
}
if searchCompleter.isSearching{
searchCompleter.cancel()
searchCompleter.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))!
searchCompleter.queryFragment = searchText
} else {
searchCompleter.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))!
searchCompleter.queryFragment = searchText
}
}
ich MKLocalSearchCompleter
verwenden Vorschläge auf, was der Benutzer tippt zu bekommen basiert in die Suchleiste:
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter){
guard completer.results.count != 0 else {return}
var searchTerm: String = completer.results.first!.title
if completer.results.first!.subtitle != "" {
searchTerm = searchTerm + ", " + completer.results.first!.subtitle
}
if let _ = addressDetector.firstMatch(in: searchTerm, options: [], range: NSMakeRange(0, searchTerm.utf8.count)){
searchAddress(for: searchTerm)
} else {
getBusinesses(withSearchTerm: searchTerm, userCoordinates: currentUserLocation.coordinate)
}
}
In dem obigen Code I NSDataDetector
sehen verwenden, wenn der vorgeschlagene Text eine Adresse ist ... wenn so dass ich es mit Hilfe MKLocalSearch
...
Schließlich Um nach Adressen zu suchen ich eine Methode definiert searchAddress(for:)
genannt:
func searchAddress(for string: String){
let localSearchRequest = MKLocalSearchRequest()
localSearchRequest.naturalLanguageQuery = string
localSearchRequest.region = (delegate?.businessSearchResultTableViewControllerNeedsUpdatedMapRegion(self))!
let localSearch = MKLocalSearch(request: localSearchRequest)
localSearch.start(completionHandler: {searchResponse, error in
guard error == nil else {
print(error.debugDescription)
return
}
guard let mapItems = searchResponse?.mapItems else {return}
self.tableViewDataSourceList = mapItems
self.tableView.reloadData()
self.delegate?.businessSearchResultTableViewStopedGettingBusiness(self, with: self.tableViewDataSourceList, at: CLLocationCoordinate2D(latitude: self.currentUserLocation.coordinate.latitude, longitude: self.currentUserLocation.coordinate.longitude))
})
}
Wenn ich zu schnell eingeben oder halten Sie auf dem Rücktaste ich das bekommen folgende Fehler in der Konsole:
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
The operation couldn’t be completed. (MKErrorDomain error 3.)
Jede Hilfe wird viel :-)
Haben Sie einen Beispielcode, den ich mir anschauen könnte oder ein Tutorial, auf das Sie mich hinweisen könnten? –
@ A.Jam so etwas wie dies funktionieren würde https://stackoverflow.com/a/38987761/4080860 – hhanesand
So eine Sache, ich bin nicht sicher: schlagen Sie den gesamten Code in der Suchleiste Delegat in den 'searchTime' Wähler bewegen Methode in dem Beispiel, das Sie mir gerade gezeigt haben? –