bugfix> swift > 投稿

検索バーに少し問題があります。画面に表示されるとおり。何もフィルタリングせずに最初にクリックすると、最初の詳細画面が表示され、2番目をクリックすると詳細が表示された2番目の画面が表示されますが、たとえば2番目(最後の画面など)をフィルタリングして結果をクリックすると、最初の画面が表示されますが、これは間違っています。2番目の画面を詳細に表示したいです。私のコードはここにあります:

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)
        }
    }

手伝ってくれてありがとう。

回答 2 件
  • 他のすべてのデータソースメソッド( cellForRownumberOfRows  など)、あなたはこれをしました:

    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
    }
    
    

  • @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
        }
    }}
    
    

    そして、これはviewDidLoad()の宛先VCにあります:

    title = test
    recLabelDesc.text = test
    
    

あなたの答え