对于我正在构建的应用,我想实现一项功能,允许用户指定葡萄酒的地理来源(国家(例如法国),地区(例如波尔多),子区域(例如Paullac))。
我想确保自己不必添加所有可用的国家/地区,并且所有进入数据库的信息都是有效的。因此,我决定这样做:
Country
对象。只有在存在这样的物体时才能保存酒车这样做很好,除了一件事:Apple地图可以从任何地方返回任何东西,比如餐馆,商店等等。
我的问题:如何指定我要查找的内容?我只能指定我正在搜索的区域,这与我的情况无关。我希望能够告诉苹果地图只能寻找国家,地区,城市等等。这有可能吗?我已经把谷歌用尽了,到目前为止没办法。
答案 0 :(得分:2)
我使用过MapKit并且不相信你可以对用户条目进行自动完成帮助,因为他们输入的最佳解决方案是Google Place API autocomplete
iOS现在提供接收地理坐标时发送格式正确的地址,或者您可以在发送一对坐标时接收地址。或者地点名称或坐标的兴趣点。
答案 1 :(得分:2)
除了Allan的回答之外,我发现如果您按照MkLocalSearchCompletion对象的字幕属性进行过滤,则可以删除业务条目。
答案 2 :(得分:1)
在iOS 9.3中添加了一个名为MKLocalSearchCompleter的MapKit类,它有助于自动完成。您可以使用“MKSearchCompletionFilterType”过滤返回的内容,但这不是最广泛的,可能不完全有助于您的情况。它确实将城市和国家作为结果返回,但它在我使用它时也会返回业务。
一种可能的选择是在应用程序端再次过滤返回的结果,并排除其中包含数字字符的所有结果。
func setupCompleter() {
self.searchCompleter = MKLocalSearchCompleter()
self.searchCompleter?.delegate = self
self.searchCompleter?.filterType = .locationsOnly
self.searchCompleter?.queryFragment = "Bordeaux"
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
print("Results \(completer.results)")
// Do additional filtering on results here
}
答案 3 :(得分:1)
关于@Trevor说的话,我发现拒绝结果,如果你只想要城镇,那么标题或副标题都有数字会产生相当好的结果。
Swift 4.1 代码:
let filteredResults = completer.results.filter({ $0.title.rangeOfCharacter(from: digitsCharacterSet) == nil && $0.subtitle.rangeOfCharacter(from: digitsCharacterSet) == nil })
或更紧凑:
{{1}}
答案 4 :(得分:0)
我们找到的最佳解决方案是在结果标题中使用逗号过滤结果。这主要只返回与城市格式(例如Detroit, MI, United States
)匹配的结果。我们将此过滤器添加到@Ben Stahl建议的过滤器中。 Ben的解决方案过滤掉了逗号组成企业名称一部分的极端情况。
这通常会在三个字符内返回正确的结果。要回答OP的问题,您可以按城市,州或国家/地区解析此字符串,以获得所需的结果。
为获得更好的结果,您可以使用Google Places API。
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
self.searchResults = completer.results.filter { result in
if !result.title.contains(",") {
return false
}
if result.title.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
return false
}
if result.subtitle.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil {
return false
}
return true
}
self.searchResultsCollectionView.reloadData()
}