Обновление высоты UITableView и данных динамически - PullRequest
0 голосов
/ 02 декабря 2018

Я реализую функцию поиска по мере ввода, но у меня возникают проблемы с динамическим обновлением количества строк в UITableView.Я использую UISearchBar и запускаю поиск после того, как пользователь набрал три буквы.

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

if let text = searchBar.text {
    if text.count >= minSearchStartCriteria {

        let tableX:CGFloat = 0
        let tableY:CGFloat = searchBar.frame.maxY
        let tableWidth:CGFloat = view.frame.width
        var tableHeight:CGFloat = 0

        // remove the tap recognizer so that the tap on the uitableview
        // can be captured
        if let tapRecognizer = tapRecognizer,
            let recognizers = view.gestureRecognizers {
            if recognizers.count > 0 {
                view.removeGestureRecognizer(tapRecognizer)
            }
        }

        // create the UITableView
        if searchResultsTable == nil {

            searchResultsTable = UITableView(frame: CGRect(x: tableX, y: tableY , width: tableWidth, height: tableHeight))

            if let searchResultsTable = searchResultsTable {
                searchResultsTable.delegate = self
                searchResultsTable.dataSource = self
                searchResultsTable.register(SearchResultTableViewCell.self, forCellReuseIdentifier: "searchResultTableCell")
                view.addSubview(searchResultsTable)
            }
        }

        // update the search results
        if let p = onlineSearchPresenter {
            p.getSearchResults(request: text) { (results) in
                self.searchResults = results
            }
            tableHeight = CGFloat(searchResults.count * 44)
            searchResultsTable?.frame = CGRect(x: tableX, y: tableY, width: tableWidth, height: tableHeight)
            searchResultsTable?.reloadData()
        }
    } else {
        // If there is less than "minSearchStartCriteria" letters, remove the table view
        searchResults.removeAll()
        searchResultsTable?.removeFromSuperview()
        searchResultsTable = nil
    }
}

Если я наберу «abcd», поиск выдаст 10 результатов, поэтому мой UITableView создается с 10 строками.Здесь нет проблем.Затем, если я продолжу добавлять буквы и сужать поиск, мне будет возвращено меньшее количество результатов, скажем, только 4. Я проверил отладчик, он показывает правильное количество результатов в массиве searchResults, но tableView(_:cellForRowAt:)stills пытается извлечь результат из индекса 4, который выходит за пределы диапазона для массива, содержащего только четыре элемента.

Похоже, мне нужно сообщить UITableView, что массив источника данных был обновлен, чтобы онобновил бы свою индексацию.Я подозреваю, что проблема заключается в асинхронном характере обновления массива результатов, но я не могу понять, в чем именно заключается проблема.

Как я могу получить эту работу?

Спасибо

1 Ответ

0 голосов
/ 02 декабря 2018

если вы думаете, что проблема связана с «асинхронным характером обновления массива результатов», вы должны использовать debouncing.

используя debouncing, вы можете ограничить частоту срабатывания функции, ожидая определенное количество времени перед ее выполнением..

https://gist.github.com/DoubleREW/567f5e67262f1de781f4f9164235d4e9

https://bradfol.com/how-can-i-debounce-a-method-call-in-swift-4/

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