【问题标题】:MKLocalSearch how do I avoid results which have subtitle "Search Nearby"?MKLocalSearch 如何避免带有“搜索附近”的结果?
【发布时间】:2020-10-14 00:45:55
【问题描述】:

我正在关注这篇文章:https://www.peteralt.com/blog/mapkit-location-search-with-swiftui/

我已经设置了一个像这样的 LocationSearchService:

extension LocationSearchService: MKLocalSearchCompleterDelegate {
    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        self.searchResults = completer.results
        self.status = completer.results.isEmpty ? .noResults : .result
    }

    func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
        self.status = .error(error.localizedDescription)
    }
}

class LocationSearchService: NSObject, ObservableObject {

    enum LocationStatus: Equatable {
        case idle
        case noResults
        case isSearching
        case error(String)
        case result
    }

    @Published var queryFragment: String = ""
    @Published private(set) var status: LocationStatus = .idle
    @Published private(set) var searchResults: [MKLocalSearchCompletion] = []

    private var queryCancellable: AnyCancellable?
    private let searchCompleter: MKLocalSearchCompleter!

    init(searchCompleter: MKLocalSearchCompleter = MKLocalSearchCompleter()) {
        self.searchCompleter = searchCompleter
        super.init()
        self.searchCompleter.delegate = self

        queryCancellable = $queryFragment
            .receive(on: DispatchQueue.main)
            .debounce(for: .milliseconds(250), scheduler: RunLoop.main, options: nil)
            .sink(receiveValue: { fragment in
                self.status = .isSearching
                if !fragment.isEmpty {
                    self.searchCompleter.queryFragment = fragment
                } else {
                    self.status = .idle
                    self.searchResults = []
                }
        })
    }
}

不幸的是,我得到了这样的值,其中包含“搜索附近”。如何过滤掉这个?

【问题讨论】:

  • 我能够在下面找到答案,但我使用的代码与您的非常相似。我注意到这里有内存泄漏。在 receiveValue 我相信它应该捕获 [weak self] 然后 self. 应该替换为 self?.

标签: ios swift


【解决方案1】:

我遇到了同样的问题。

在设置 MKLocalSearchCompleter 时,我可以通过以下方式指定我只需要地址和兴趣点来修复它。

searchCompleter.resultTypes = MKLocalSearchCompleter.ResultType([.address, .pointOfInterest])

【讨论】:

  • 谢谢丹尼斯,这对 Swift 来说看起来不错,但我在 ObjC 工作。此外,出于与此问题无关的原因,我们选择使用 Google 地图而不是 MKLocalSearchCompleter 实现自动完成...
【解决方案2】:

我正在处理类似的问题。 MKLocalSearchCompleter 类包含一个属性resultTypes,根据documentation,它允许您选择:

  • 查询
  • 兴趣点
  • 地址

因此,您似乎希望将完成者设置为排除结果类型“查询”,例如:

completer.resultTypes = [.address, .pointOfInterest] ** 这不是工作代码

但是,我发现没有使用此属性的有用方法。我的解决方案是使用字符串过滤器来删除包含字符串“Search Nearby”的结果:

- (void)completerDidUpdateResults:(MKLocalSearchCompleter *)completer {
    
    NSMutableArray *suggestions = [[NSMutableArray alloc] init];
    NSArray* results = completer.results;
    
    for (MKLocalSearchCompletion *place in results)
    {
        if ([@"Search Nearby" isEqualToString:place.subtitle]) {
            continue;
        }
        [suggestions addObject:place];
    }
    ... // do something with suggestions
}

或在 Swift 中:

var suggestions : [MKLocalSearchCompletion] = []
for place in results {
    if place.subtitle == "Search Nearby" { continue }
    resultsToReturn.add(place)
} 

我真的不喜欢这个解决方案,但它现在对我有用。

【讨论】:

  • 谢谢,我自己试试看!我最终选择了 Mapbox Search sdk,尽管它是新的并且处于测试阶段。工作,所以畅通无阻:D
  • 约翰,我想我明白了。看我的回答。希望对您有所帮助。
猜你喜欢
  • 2013-09-27
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多