Панель поиска не перезагружается к исходным данным после результатов поиска с помощью Swift? - PullRequest
0 голосов
/ 09 февраля 2019

В моем сценарии я реализовал кодовую базу для UISearchbar с некоторым эффектом animation, таким как expand и collapse.

Здесь, когда я пытаюсь search, результат поиска отображается значительно позжеЯ добавил пользовательскую очистку button, она будет operate сворачивать анимацию в то же время reload результат поиска в original таблицу data.

Мои проблемы возникают, когда я нажимаю пользовательскую кнопку очистки searchрезультат не перезагружается в original данные в tableview.

func didTapFavoritesBarButtonOFF() {

        self.navigationItem.setRightBarButtonItems([self.favoritesBarButtonOn], animated: false)
        print("Hide Searchbar")

        // Reload tableview 
        searchBar.text = nil
        searchBar.endEditing(true)
        filteredData.removeAll()
        self.tableView.reloadData() // not working

        // Dismiss keyboard
        searchBar.resignFirstResponder()

        // Enable navigation left bar buttons
        self.navigationItem.leftBarButtonItem?.isEnabled = false

        let isOpen = leftConstraint.isActive == true

        // Inactivating the left constraint closes the expandable header.
        leftConstraint.isActive = isOpen ? false : true

        // Animate change to visible.
        UIView.animate(withDuration: 1, animations: {
            self.navigationItem.titleView?.alpha = isOpen ? 0 : 1
            self.navigationItem.titleView?.layoutIfNeeded()
        })
    }

Моя ячейка Tableview

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredData.count
 }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath) as! CustomTableViewCell
    cell.titleLabel.text = self.filteredData[indexPath.row]
    return cell
}

1 Ответ

0 голосов
/ 09 февраля 2019

Вам необходимо установить исходный массив данных.

Причина

На самом деле вы удаляете массив источника данных filteredData.removeAll().После этого массив становится пустым, поэтому self.tableView.reloadData() не работает.

Решение

Вам необходимо сделать копию массива источника данных, скажем, originalData содержит исходные данные (без фильтра).

Всякий раз, когда вы фильтруете пользователя, вам необходимо использовать originalData для фильтрации данных.

Для напр.

let filterdData = originalData.filter { //filter data }

Поэтому, когда вы очищаете фильтр, вам нужно снова установить исходные данные в массив источника данных таблицы.

Например,

filteredData.removeAll() //remove all data
filterData = originalData //Some thing that you need to assign for table data source
self.tableView.reloadData()

В таблице cellForRowAt: получит данные следующим образом...

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

      var obj = filterData[indexPath.row] 
      print(obj)

 }

Не забудьте присвоить данные originalData перед фильтром

...