Swift - ошибка с результатами после использования панели поиска - PullRequest
0 голосов
/ 28 апреля 2018

У меня небольшая проблема с панелью поиска. Как вы видите на экранах. Когда я ничего не фильтрую и нажимаю первый, он показывает мне первый подробный экран, когда я нажимаю второй, он показывает второй экран с подробностями, но когда я фильтрую что-то, например, второе (как на последнем экране) и нажимаю на результат , он показывает мне первый экран, который не так, я хочу видеть второй экран с деталями. Мой код здесь:

import UIKit

    //array definiton
    var names = [String]()
    var namesDesc = [String]()
    var namesDescWhereTo = [String]()
    var imageArr = [UIImage(named: "Alobal")!,UIImage(named: "Akumulátory")!,UIImage(named: "Akvária")!,UIImage(named: "Autovrak")!,UIImage(named:                  "Autosklo")!]
    var myIndex = 0


class mainTableViewController: UITableViewController, UISearchResultsUpdating {

    //definition variables for VC
    var namesTableView = names
    var filteredNames = [String]()
    var searchController : UISearchController!
    var resultsController = UITableViewController()


    override func viewDidLoad() {
        super.viewDidLoad()

        //load file with names - names.txt
        do {
            //definice názvu souboru + oddělovače
            if let path = Bundle.main.path(forResource: "names", ofType: "txt"){
                let data = try String(contentsOfFile:path, encoding: String.Encoding.utf8)
                names = data.components(separatedBy: "\n")
            }
        } catch let err as NSError {
            //pokud je nějaký error
            print(err)
        }

        //load file with descriptions - namesDesc.txt
        do {
            //definice názvu souboru + oddělovače
            if let path = Bundle.main.path(forResource: "namesDesc", ofType: "txt"){
                let data = try String(contentsOfFile:path, encoding: String.Encoding.utf8)
                namesDesc = data.components(separatedBy: "\n")
            }
        } catch let err as NSError {
            //pokud je nějaký error
            print(err)
        }

        //load file with information "where to" - namesDescWhereTo.txt
        do {
            //definice názvu souboru + oddělovače
            if let path = Bundle.main.path(forResource: "namesDescWhereTo", ofType: "txt"){
                let data = try String(contentsOfFile:path, encoding: String.Encoding.utf8)
                namesDescWhereTo = data.components(separatedBy: "\n")
            }
        } catch let err as NSError {
            //pokud je nějaký error
            print(err)
        }


        namesTableView = names

        //definiton main title + call method setupNavBar()
        self.title = "Where to?"
        setupNavBar()


        self.resultsController.tableView.dataSource = self
        self.resultsController.tableView.delegate = self
        self.searchController = UISearchController(searchResultsController: self.resultsController)
        self.tableView.tableHeaderView = self.searchController.searchBar
        self.searchController.searchResultsUpdater = self
        self.searchController.dimsBackgroundDuringPresentation = false
        definesPresentationContext = true

    }



    //method where I define large titles
    func setupNavBar() {
        navigationController?.navigationBar.prefersLargeTitles = true

    }

    func updateSearchResults(for searchController: UISearchController) {
        self.filteredNames = self.namesTableView.filter { (name:String) -> Bool in
            if name.lowercased().contains(self.searchController.searchBar.text!.lowercased()) {
                return true
            } else {
                return false
            }
        }
        //reloading
        self.resultsController.tableView.reloadData()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == self.tableView {
            return self.namesTableView.count
        } else {
            return self.filteredNames.count
        }
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        if tableView == self.tableView {
            cell.textLabel?.text = self.namesTableView[indexPath.row]
        } else {
            cell.textLabel?.text = self.filteredNames[indexPath.row]
        }
            return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        myIndex = indexPath.row
        performSegue(withIdentifier: "segue", sender: self)
        }

    }

main screen

If I click first

If I click second

If I search second and click on result, it shows me first page

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

@ Sweeper Я добавил prepareForSegue, но проблема та же :( в целевом VC после фильтрации я не вижу правильных результатов. Это я добавляю в основной VC.

override func prepare(
for segue: UIStoryboardSegue, sender: Any ? ) {
if segue.identifier == "segue" {
    if let indexPath = tableView.indexPathForSelectedRow {
        let resultName: String
        if isFiltering() {
            resultName = filteredNames[indexPath.row]
        } else {
            resultName = namesTableView[indexPath.row]
        }
        let controller = segue.destination as!ViewController
        controller.test = resultName
    }
}}

И это у меня в VC назначения в viewDidLoad ():

title = test
recLabelDesc.text = test
0 голосов
/ 28 апреля 2018

Во всех других ваших источниках данных (cellForRow, numberOfRows и т. Д.) Вы делали это:

if tableView == self.tableView {
    // use the normal data source array
} else {
    // use the filtered data source array
}

Так почему бы не сделать это в prepareForSegue, где вы передаете элемент, соответствующий myIndex следующему контроллеру?

У вас нет экземпляра tableView, поэтому вы не можете проверить, выполняет ли пользователь поиск, не так ли?

Кроме проверки того, является ли переданное табличное представление исходным табличным представлением, вы можете проверить свойство isActive searchController:

if searchController.isActive && searchController.searchBar.text != "" {
    // use the filtered data
} else {
    // use the normal data
}
...