4

对于我正在构建的应用程序,我想实现一个功能,允许用户指定葡萄酒的地理来源(国家(例如法国)、地区(例如波尔多)、次地区(例如保拉克))。

我想确保我不必自己添加所有可用的国家,并且进入数据库的所有信息都是有效的。因此,我决定这样做:

  1. 用户添加了一种新酒并输入了它来自的国家/地区的名称
  2. 打字时,应用程序在苹果地图数据库中搜索
  3. 此搜索的结果将显示为建议,当用户点击建议时,应用程序会创建一个Country包含所有相关信息的对象。仅当存在此类对象时才保存葡萄酒车

这很好用,除了一件事:Apple 地图从任何地方返回任何东西,如餐馆、商店等。

我的问题:如何指定我要查找的内容?我只能指定我正在搜索的区域,这与我的情况无关。我希望能够告诉苹果地图只查找国家、地区、城市等。这在某种程度上可能吗?为此,我已经用尽了谷歌,但到目前为止还没有找到任何方法。

4

5 回答 5

3

离开@Trevor 所说的话,我发现如果您只想要城市和城镇,拒绝标题或副标题有数字的结果会产生相当不错的结果。

斯威夫特 4.1代码:

// Store this as a property if you're searching a lot.
let digitsCharacterSet = NSCharacterSet.decimalDigits

let filteredResults = completer.results.filter { result in    
    if result.title.rangeOfCharacter(from: digitsCharacterSet) != nil {
        return false
    }

    if result.subtitle.rangeOfCharacter(from: digitsCharacterSet) != nil {
        return false
    }

    return true
}

或更简洁:

let filteredResults = completer.results.filter({ $0.title.rangeOfCharacter(from: digitsCharacterSet) == nil && $0.subtitle.rangeOfCharacter(from: digitsCharacterSet) == nil })
于 2018-04-18T23:36:13.663 回答
3

我们找到的最佳解决方案是在结果标题中使用逗号过滤我们的结果。这主要只返回与城市格式匹配的结果,例如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()
}
于 2018-09-20T14:50:41.870 回答
2

我使用过 MapKit,不相信您可以对用户条目进行自动完成帮助,因为他们键入了我发现的最佳解决方案是Google Place API 自动完成

iOS 现在在发送格式良好的地址时提供接收地理坐标,或者您可以在发送一对坐标时接收地址。或地点名称或坐标的兴趣点。

于 2017-02-03T21:13:13.527 回答
2

iOS 9.3 中的 MapKit 添加了一个名为MKLocalSearchCompleter的类,它有助于自动完成。您可以使用“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
}
于 2017-03-29T21:13:40.817 回答
2

除了 Allan 的回答,我发现如果您按 MkLocalSearchCompletion 对象的 subtitle 属性进行过滤,您可以删除业务条目。

于 2017-06-02T16:09:38.257 回答