строки, отфильтрованные в tableview, перезагружаются после выбора строки

#ios #swift

#iOS #swift

Вопрос:

Я реализовал панель поиска для моего tableview с помощью: let searchController = UISearchController(searchResultsController: nil) и в viewDidLoad:

 override func viewDidLoad() {
        super.viewDidLoad()

        tblSearchTable.delegate = self
        tblSearchTable.dataSource = self
        loadListOfCountries()
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tblSearchTable.tableHeaderView = searchController.searchBar
           }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

    }
  

Моя проблема в том, что при поиске элементов в таблице отображаются отфильтрованные строки, но когда я нажимаю / щелкаю строку, строки tableview перезагружаются (все элементы).). Это моя функция didselectrow:

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected row")

        self.dismiss(animated: false, completion: nil)
           }
  

Текст selected row печатается, но viewcontroller не отклоняется, а вместо этого, как я уже сказал, перезагружает все исходные элементы в tableview.

Вот расширения, которые могут понадобиться при оказании мне помощи:

 @available(iOS 10.0, *)
extension Search: UISearchBarDelegate {
    // MARK: - UISearchBar Delegate
    func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
        filterContentForSearchText(searchText: searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
    }
}

@available(iOS 10.0, *)
extension Search: UISearchResultsUpdating {
    public func updateSearchResults(for searchController: UISearchController) {
        filterContentForSearchText(searchText: searchController.searchBar.text!)
    }
}
  

И вот функция поиска:

 func filterContentForSearchText(searchText: String, scope: String = "All") {
        filteredArray.removeAll()

        var x = 0
        for a in dataArray{

            if(  a.lowercased().contains(searchText.lowercased())){

                filteredArray.append(a)


            }
            x = x   1
        }


        self.tblSearchTable.reloadData()
    }
  

Вот полный код:

 import UIKit
import CoreData

@available(iOS 10.0, *)
class Search : UIViewController, UITableViewDelegate, UITableViewDataSource{




    var dataArray = [String]()
    var dataLine = [String]()
    var dataColor = [String]()

    var filteredArray = [String]()
    var filteredLine = [String]()
    var filteredColor = [String]()


let searchController = UISearchController(searchResultsController: nil)

    @IBOutlet var tblSearchTable: UITableView!


       override func viewDidLoad() {
        super.viewDidLoad()

        tblSearchTable.delegate = self
        tblSearchTable.dataSource = self
        loadListOfCountries()
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true
        tblSearchTable.tableHeaderView = searchController.searchBar
           }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
           }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: UITableView Delegate and Datasource functions
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected row")

        self.dismiss(animated: false, completion: nil)


        //var ClassViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        //ClassViewController.funcforsearch()
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if searchController.isActive amp;amp; searchController.searchBar.text != "" {
            return filteredArray.count
        }
        return dataArray.count

    }
    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "idCell", for: indexPath as IndexPath)

        if searchController.isActive amp;amp; searchController.searchBar.text != "" {
            cell.textLabel?.text = filteredArray[indexPath.row]
        } else {
            cell.textLabel?.text = dataArray[indexPath.row]
        }
        //cell.textLabel?.text = candy.name
        //cell.detailTextLabel?.text = candy.category
        return cell

    }


    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 60.0
    }


    // MARK: Custom functions

    func loadListOfCountries() {
        //get some array here
        self.tblSearchTable.reloadData()

    }
    func filterContentForSearchText(searchText: String, scope: String = "All") {
        filteredArray.removeAll()

        var x = 0
        for a in dataArray{

            if(  a.lowercased().contains(searchText.lowercased())){

                filteredArray.append(a)


            }
            x = x   1
        }


        self.tblSearchTable.reloadData()
    }

}
@available(iOS 10.0, *)
extension Search: UISearchBarDelegate {
    // MARK: - UISearchBar Delegate
    func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
        filterContentForSearchText(searchText: searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
    }
}

@available(iOS 10.0, *)
extension Search: UISearchResultsUpdating {
    public func updateSearchResults(for searchController: UISearchController) {
        filterContentForSearchText(searchText: searchController.searchBar.text!)
    }
}
  

Спасибо!

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

1. пожалуйста, ознакомьтесь с обновленным кодом

2. Только это: override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) }

3. удалите self.dismiss(animated: false, completion: nil) код и посмотрите. И какова цель этой строки кода?

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

5. что popup здесь? Таблица поиска?