Передача данных в панель поиска

#ios #swift #uisearchbar

#iOS #swift #панель пользовательского поиска

Вопрос:

У меня есть 2 ViewController, которые нравятся друг другу. У первого ViewController есть кнопка CollectionView as, поэтому, когда вы нажмете на CollectionView, он направит вас ко второму ViewContoller через segue.

   @IBAction func presedCollectionViewButton(_ sender: Any) {
    performSegue(withIdentifier: "segue", sender: self)
  }

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let destinationVC = segue.destination as! AllCategoriesViewController
    destinationVC.filterText = test

}
  

Затем я передал данные в панель поиска, которая находится во втором CONTROLVIEW, чтобы отфильтровать TableView после выполнения perform segue, но она не фильтрует TableView напрямую, и чтобы увидеть переданный мной текст фильтра, я должен нажать на панель поиска в ViewController.

 extension AllCategoriesViewController: UISearchBarDelegate {

     func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchBar.text = filterText
        filteredCategory = allcotegoryLabel.filter({$0.categoryName.prefix(searchText.count) == searchText})
        isSearch = true
        allCategoriesTableView.reloadData()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        isSearch = false
        searchBar.text = ""
        allCategoriesTableView.reloadData()
    }
}
  

Итак, мой вопрос в том, как решить эту проблему и позволить ей фильтровать TableView после выполнения перехода к преформе?

   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "allCategories", for: indexPath) as! allCategoriesTableViewCell
    if isSearch {
       cell.allCategoriesLabel.text = filteredCategory[indexPath.row].categoryName
    } else {
       cell.allCategoriesLabel.text = allcotegoryLabel[indexPath.row].categoryName
    }
    return cell
}
  

вот некоторое использование isSearch

Ответ №1:

Вы должны установить текст строки поиска в переменную, а не в строку поиска. Затем задайте текст строки поиска в viewDidLoad() методе, после этого обновите TableView в viewDidLoad . Если это не сработает, вы можете попробовать то же самое в viewDidAppear .

Комментарии:

1. тем не менее, мне нужно нажать на панель поиска, чтобы отфильтровать tableview, я думаю, мне нужно изменить метод textDidChange, но какова альтернатива. @Luc

2. @Saleh96 Для чего нужен isSearch bool? Мне это кажется немного странным

3. У меня есть два массива (filteredCategory) и (allcotegoryLabel) для tableview .(filteredCategory) имеют отфильтрованный результат, поэтому я использовал isSearch, чтобы проверить, выполняет ли пользователь поиск, а затем отобразить (filteredCategory) в tableview и, если нет, отобразить (allcotegoryLabel). Я отредактировал вопрос, чтобы показать некоторое использование isSearch. @Luc

4. @Saleh96 Проблема в том, что textDidChange не запускается, пока пользователь не взаимодействует с панелью поиска. Обходной путь заключался бы в настройке данных для табличного представления, а затем текста для панели поиска отдельно. Вы не можете включить textDidChange , чтобы установить фильтр просмотра таблиц при загрузке представления. В принципе, установка текста на панели поиска не считается изменением текста.

5. Рад помочь! 👍🏻👍🏻