搜索后,我的tableview单元格的索引会发生变化

时间:2018-05-23 15:48:42

标签: ios swift uitableview

搜索完单元格后,我想点击它并执行操作。但是在搜索之后,我的单元格的索引总是0,因为它是表视图中的第一个东西。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
    @IBOutlet weak var TableView: UITableView!
    @IBOutlet weak var SearchBar: UISearchBar!

    var Array = ["One","Two","Three","Four"]
    var myIndex = Int()
    var Filter = [String]()
    var isSearching = false

    override func viewDidLoad() {
        super.viewDidLoad()

        TableView.delegate = self
        TableView.dataSource = self
        SearchBar.delegate = self
        SearchBar.returnKeyType = UIReturnKeyType.done
    }

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

        return Array.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 55
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = TableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell
        cell.CellLabel.text = Array[indexPath.row]

        if isSearching {
            cell.CellLabel.text = Filter[indexPath.row]
        }else {
            cell.CellLabel.text = Array[indexPath.row]
        }
        return cell
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if SearchBar.text == nil || searchBar.text == "" {
            isSearching = false
            view.endEditing(true)
            TableView.reloadData()
        }else {
            isSearching = true
            Filter = Array.filter({$0.contains(searchBar.text!)})
            TableView.reloadData()
        }}

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        myIndex = indexPath.row

        switch myIndex {
        case 0:
            print("one")
        case 1:
            print("two")
        case 2:
            print("three")
        case 3:
            print("four")
        default:
            print("Error")
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您需要将搜索isSearching逻辑放在didSelectRowAt

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

  var index = 0

     if isSearching { 

         index = Array.index(of:Filter[indexPath.row])
     }
     else {

         index = Array.index(of:Array[indexPath.row])
     }
 }

答案 1 :(得分:0)

在tableView(:didSelectRowAt)方法中,您有从03的硬编码索引。但是,tableView在ArrayFilter个集合之间切换。此外,Filter集合中的数据可能会发生变化,具体取决于搜索字段中的文字。

你可以像@Sh_Khan一样解决它。但也许更好的做法是拥有一个与tableView绑定的过滤集合和一个包含所有数据的未经更改的集合。

这样,您无需检查是否在每种方法中都设置了isSearching。事实上,你完全不需要它。您只需要执行以下操作:

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell
    cell.CellLabel.text = Filter[indexPath.row]
    return cell
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == "" {
        view.endEditing(true)
        Filter = Array.compactMap({ $0 }) // Copies all elements from Array
    } else {
        Filter = Array.filter({ $0.contains(searchBar.text!) })
    }
    TableView.reloadData()
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print(Filter[indexPath.row])
}