Как отфильтровать массив из UISearchController - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь отфильтровать массив из UISearchController, но это не удалось. Моя первая попытка - я пытаюсь создать два массива: первый массив предназначен для хранения данных, а второй массив - для хранения фильтра. чем сделать мой numberOfRowsInSection массивом фильтров, но он все еще не работает, что пошло не так? вот мой код.

    // This is in my PopularViewController
    let store = PopularStore()
    var timer: Timer?
    var page = 1
    var hasMoreMovies = true
    let dataSource = PopularDataSource()

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchMovie(page: page)
    }

    private func fetchMovie(page: Int) {
        showLoadingView()
        timer?.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { _ in
            self.store.fetchMovie(page: page, completion: { [weak self] result in
                guard let self = self else { return }
                self.dismissLoadingView()
                switch result {
                case .success(let movies):
                    if movies.count < 100 { self.hasMoreMovies = false }
                    self.dataSource.items.append(contentsOf: movies)
                case .failure(let error):
                    print(error)
                }
                self.tableView.reloadSections(IndexSet(integer: 0), with: .none)
            })
        })
    }

    extension PopularViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if !searchText.isEmpty {
            dataSource.filterMovie = dataSource.items.filter({ $0.title.lowercased().contains(searchText.lowercased() )})

            dataSource.filterMovie = dataSource.items
          }
       }
    }

    // This is in my UITableViewDataSource
    class PopularDataSource: NSObject, UITableViewDataSource {
    var items = [Movie]()
    var filterMovie = [Movie]()

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: PopularCell.cellID, for: indexPath)

        return cell
    }
}

1 Ответ

1 голос
/ 06 мая 2020

Поскольку filterMovie является основным источником данных, назначьте весь список (items) или отфильтрованные элементы в зависимости от searchText и перезагрузите представление таблицы

extension PopularViewController: UISearchBarDelegate {
   func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
       if !searchText.isEmpty {
           dataSource.filterMovie = dataSource.items.filter{ $0.title.range(of: searchText, options: .caseInsensitive) != nil }
       } else {
           dataSource.filterMovie = dataSource.items
       }
       self.tableView.reloadData()
   }
}

Если целью развертывания является iOS 13 рассмотрите возможность использования UITableViewDiffableDataSource для заполнения табличного представления. Это очень быстро, и вы получаете умную анимацию.

...