Странный TableView и SearchBar - PullRequest
0 голосов
/ 13 июня 2018

У меня очень странная проблема с моим SearchBar и TableView.У меня есть MapView с этим SearchBar, вы можете искать имя места на панели поиска, и я фильтрую имя с базой данных, если имя существует, оно будет добавлено в TableView.Я могу искать это без проблем, но у меня есть две странные проблемы.Если я получу 3-4 значения в TableView, если я ищу как пятое значение, оно не будет отображаться.Вторая проблема, с которой я столкнулся, заключается в том, что если у меня есть похожее название места и я нажимаю на одно из двух, если я пытаюсь исследовать его во второй раз, в табличном представлении будет отображаться только имя, которое я щелкнул ранее, и если я попытаюсь щелкнуть его дляв третий раз, и я пытаюсь исследовать это, таблица не покажет это.(Когда я нажимаю на значение в TableView, оно просто показывает его на карте.)

Видео ошибки: https://streamable.com/e72wn

Код:

extension LocationSearchTable : UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
    //print("updateSearchResults")

    // *When user open the Search Bar and he doesn't type text or the text is very short this code clean the TableView.*
    let searchText = searchController.searchBar.text
    if searchText == nil || searchText!.isEmpty {
        seenNames.removeAll()
        matchingItems.removeAll()
        self.tableView.reloadData()
    }

    guard let mapView = mapView else { return }

    let request = MKLocalSearchRequest()
    request.naturalLanguageQuery = searchText
    request.region = mapView.region
    let search = MKLocalSearch(request: request)

    search.start { response, _ in
        guard let response = response else {
            return
        }

        for (index , name) in response.mapItems.enumerated() {
            let item = response.mapItems[index]
            if(checkIfNameExistInDB(key: String(name.name!)) != nil && !seenNames.contains(name.name!)){
                matchingItems.append(item)
                seenNames.insert(name.name!)
                self.tableView.reloadData()
            }
            else {
                print(name.name!)
            }
        }
}
}
}

Код TableView:

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
    let selectedItem = matchingItems[indexPath.row].placemark
    cell.textLabel?.text = selectedItem.name
    cell.imageView?.image = imageWithImage(image: UIImage(named: "search_1x")!, scaledToSize: CGSize(width: 20, height: 20))
    cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
    return cell
}

После ошибки с первым именем панель поиска выглядит заблокированной и ничего не ищет

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Ваша первая проблема вызвана большим количеством запросов, порожденных при вводе условий поиска, потому что для каждого введенного или удаленного символа создается и запускается новый MKLocalSearch.Чтобы убедиться в этом, я положил что-то вроде вашего кода на игровую площадку и протестировал:

import PlaygroundSupport
import UIKit
import MapKit

PlaygroundPage.current.needsIndefiniteExecution = true

var searches = [MKLocalSearch]()

for i in 1...100 {
    let request = MKLocalSearchRequest()
    request.naturalLanguageQuery = "Via roma n. \(i), Roma"
    let search = MKLocalSearch(request: request)
    search.start { (response, error) in
        guard error == nil else {
            print("request \(i) finished with error \(error!.localizedDescription)")
            return
        }
        guard let _ = response else {
            print("request \(i) finished with no response")
            return
        }

        print("request \(i) completed successfully!")
    }
    searches.append(search)
}

. Вы увидите, что некоторые запросы выполнены без ошибок, а для некоторых запросов вы получите

The operation couldn’t be completed. (MKErrorDomain error 3.)

Что является MKErrorLoadingThrottled.Эта ошибка, согласно Apple dev , возникает, когда

Данные не были загружены, поскольку действует регулирование данных.Эта ошибка может возникать, если приложение часто запрашивает данные в течение короткого периода времени.

Более того, согласно Apple dev :

Тамнет ограничений по запросу для приложения или идентификатора разработчика, поэтому хорошо написанные приложения, которые работают правильно, не должны испытывать никаких проблем.Однако регулирование может происходить в плохо написанном приложении, которое создает чрезвычайно большое количество запросов.

Таким образом, в конечном итоге решением вашей проблемы может быть отсрочка запуска поискового запроса до тех пор, пока пользователь не получитзакончил печатать (вы можете использовать таймер, который срабатывает, когда пользователь не нажимал какую-либо клавишу на клавиатуре в течение определенного времени.)

PS: ОЧЕНЬ ВАЖНО не забудьте отменить предыдущий запрос, прежде чем начинать новый,в противном случае вы получите непредсказуемое поведение

0 голосов
/ 13 июня 2018

Сохранить matchingItems.removeAllObjects() в func updateSearchResults(for searchController: UISearchController)

Каждый раз, когда изменяется текст поиска, вам необходимо удалить объекты.

, тогда соответствующие объекты будут добавлены в массив

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...