iOS MKLocalSearch导致崩溃[重复]

Posted

技术标签:

【中文标题】iOS MKLocalSearch导致崩溃[重复]【英文标题】:iOS MKLocalSearch causing crash [duplicate] 【发布时间】:2020-09-03 13:11:55 【问题描述】:

我正在使用 UISearchBar 和 UITableView 执行 MKLocalSearch。

第一次搜索总是很有效,但如果您尝试另一个搜索,应用程序会崩溃,并且我会收到“索引超出范围错误”。如果您需要更多信息,请告诉我,谢谢。

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        self.searchResults = [] //this might be causing the crash
        print("searchText \(searchText)")
        let searchRequest = MKLocalSearch.Request()
        searchRequest.naturalLanguageQuery = searchText
        
        let search = MKLocalSearch(request: searchRequest)
        search.start  response, error in
            guard let response = response else 
                print("Error: \(error?.localizedDescription ?? "Unknown error").")
                return
            

            for item in response.mapItems 
                self.searchResults.append(item.placemark)
                self.tableView.reloadData()
            
        
    



//MARK: TableView
extension LocationSearchViewController: UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return searchResults.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "ResultCell", for: indexPath)
        let listItem = searchResults[indexPath.row]
        cell.textLabel?.text = listItem.name
        cell.detailTextLabel?.text = listItem.administrativeArea ?? ""

        return cell
    
    



extension LocationSearchViewController: UITableViewDelegate 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        print("selected a row")
        let local = searchResults[indexPath.row]
 
        // pass local back
        if let delegate = delegate
            delegate.doSomethingWith(data: local)
        
        
        
        dismiss(animated: true, completion: nil)
    

在第 3 次或第 4 次尝试搜索后,表中的结果保持不变,不再记录任何结果。我得到了错误:

错误:操作无法完成。 (MKErrorDomain 错误 3。)

【问题讨论】:

在异常崩溃时贴出全文 【参考方案1】:

您的问题是您过早更改了 searchResults。试试:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
    print("searchText \(searchText)")
    let searchRequest = MKLocalSearch.Request()
    searchRequest.naturalLanguageQuery = searchText
    
    let search = MKLocalSearch(request: searchRequest)
    search.start  response, error in
        guard let response = response else 
            print("Error: \(error?.localizedDescription ?? "Unknown error").")
            return
        
        var newArray: [YourStruct] = []
        for item in response.mapItems 
            newArray.append(item.placemark)
            
        
        self.searchResults = newArray
        self.tableView.reloadData()
    

【讨论】:

好的,谢谢,它似乎不再崩溃,但在第 3 次或第 4 次尝试搜索后 - 表格视图结果没有改变,我得到:searchText Rale 错误:无法完成操作. (MKErrorDomain 错误 3。)。在控制台中。另外,如果我的问题现在不同,我会接受您的正确回答。顺便把 let newArray 改成 var,谢谢 Kstin!

以上是关于iOS MKLocalSearch导致崩溃[重复]的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 导致 iOS7 崩溃?

模型验证导致 iOS 应用崩溃

Firestore 电话验证导致 ios 崩溃 (Flutter)

iOS核心数据在后台获取导致崩溃

iOS - 未解决的错误导致崩溃:悬挂对无效对象的引用

在 iOS 7 上显示 UIImagePickerController 会导致崩溃