我正在尝试构建一个自动填充文本字段,只需要显示城市/城镇名称。
所以我想做的是当有人进入时
Am
它会显示
阿姆斯特丹
阿姆斯多芬
所以它只会显示实际的城市名称,除此之外什么都没有。它不需要考虑社区等。
我已经应用了过滤器,但这并没有解决它。
lazy var searchCompleter: MKLocalSearchCompleter = {
let sC = MKLocalSearchCompleter()
sC.delegate = self
sC.filterType = .locationsOnly
return sC
}()
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
self.searchSource = completer.results.map { $0.title }
DispatchQueue.main.async {
for result in self.searchSource! {
print(result)
}
}
}
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
print(error.localizedDescription)
}
有谁知道是否有可能实现我的目标?
答案 0 :(得分:0)
我一直在寻找一种在我的应用程序中执行此操作的方法,但是MKLocalSearchCompletion似乎不是此操作的理想工具。使用Google的Map API或仅使用城市名称的本地数据库可能会更简单。
iOS本机框架中的另一个选项是利用相关的MKLocalSearchRequest并提取与城市/城镇最接近的“ locality”字段。这篇文章提供了有关沿着这条路线走的更多信息:
How to extract country and city from MKLocalSearchCompletion?
话虽如此,我确实通过解析返回结果中的title属性来检查“逗号”字符而仅使用MKLocalSearchCompletion取得了一些进展。逗号的存在表示直到第一个逗号的整个字符串是城镇,城市或州。下面的简单示例接受文本字段输入,并在表视图中仅返回过滤后的结果。
我必须指出,它似乎对美国的城市来说效果很好,因为MKLocalSearchCompletion数据库对于该地区似乎更为完善。一些国际城市未显示,因为结果未遵循此方法使用的相同“逗号”格式。
import UIKit
import MapKit
class ViewController: UIViewController, MKLocalSearchCompleterDelegate, UITableViewDelegate, UITableViewDataSource {
var completer = MKLocalSearchCompleter()
var completionResults: [MKLocalSearchCompletion] = []
var cityResults: [String] = [] {
didSet {
citySearchTable.reloadData()
}
}
@IBOutlet weak var citySearchTable: UITableView!
@IBAction func cityTextChanged(_ sender: UITextField) {
completer.queryFragment = sender.text!
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let coordUSA = CLLocationCoordinate2DMake(39.999733,-98.678503);
completer.region = MKCoordinateRegion(center: coordUSA, latitudinalMeters: 1, longitudinalMeters: 1)
completer.delegate = self
citySearchTable.delegate = self
citySearchTable.dataSource = self
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
completionResults = completer.results
completionResults = completionResults.filter({ (result) -> Bool in
return result.title != ""
})
if completionResults.count > 0 {
var newResults: [String] = []
for result in completionResults {
if result.title.contains(",") {
let splitByComma = result.title.components(separatedBy: ",")
if splitByComma.count > 0 {
if !newResults.contains(splitByComma[0]) {
newResults.append(splitByComma[0])
}
}
}
}
if newResults.count > 0 {
cityResults = newResults
}
}
}
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
//
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cityResults.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = citySearchTable.dequeueReusableCell(withIdentifier: "cell")!
cell.textLabel?.text = cityResults[indexPath.row]
cell.textLabel?.adjustsFontSizeToFitWidth = true
return cell
}
}
我知道这篇文章已有几年历史了,但是它确实是在我最近的研究中提出的,并且与我目前的工作有关,所以我想我会发表我的想法。