我的 searchBar 过滤器无法正常运行

My searchBar filter is not function correctly

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UISearchBarDelegate {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!

var filteredStates = [State]()


var states = [

    State(stateName: "Alabama", abbreviation: "AL" ),
    State(stateName: "Alaska", abbreviation: "AK" ),
    State(stateName: "Arizona", abbreviation: "AZ"),
    State(stateName: "Arkansas", abbreviation: "AR"),
    State(stateName: "California", abbreviation: "CA"),
    State(stateName: "Colorado", abbreviation: "CO"),
    State(stateName: "Connecticut", abbreviation: "CT"),

]




override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    searchBar.delegate = self
    filteredStates = states



    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    tableView.addGestureRecognizer(tap)



}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as UITableViewCell

    let state = states[indexPath.row]

    cell.textLabel?.text = state.stateName

    cell.detailTextLabel?.text = state.abbreviation

    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return filteredStates.count
}


// This method updates filteredData based on the text in the Search Box
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {


    filteredStates = searchText.isEmpty ? states : states.filter { (item: State) -> Bool in

    return item.stateName.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil


    }

    print(filteredStates)

    tableView.reloadData()
}


// Wehn search bar being editing, cancel button pops up
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {

    self.searchBar.showsCancelButton = true

}

// When search bar cancel button clicked
// Cancel button dismiss, search text is empty, keyboard dismiss
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {

    searchBar.showsCancelButton = false
    searchBar.text = ""
    searchBar.resignFirstResponder()

}

// when click outside of keyboard
// Keyboard dismiss
func handleTap() {

    self.view.endEditing(true)

}

// When clicked search button
// keyboard dismiss
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    searchBar.resignFirstResponder()

}



}

我的过滤器工作不正常。不确定我哪里做错了。我认为功能 searchBar 功能可能有问题。

The filter is not working correct

The filter is not working correct2

创建另一个数组来存储搜索到的值

在您的 searchBar: textDidChange 方法上实施过滤器逻辑

创建一个布尔值(例如 isActive)以指示搜索是在 searchBarShouldBeginEditingsearchBarCancelButtonClicked

上发生还是取消

在您的 cellForRow 上,您可以检查 Bool isActive 以将 let state = states[indexPath.row] 切换为 let state = filteredStates[indexPath.row]

我稍微更改了您的代码,使用 filter 包含 UISearchBar 的委托方法并进行了一些更改,并使用 filteredStatesUITableViewDataSource 的所有方法。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {


     @IBOutlet weak var tableView: UITableView!
     @IBOutlet weak var searchBar: UISearchBar!

    var filteredStates = [State]()


    var states = [

        State(stateName: "Alabama", abbreviation: "AL" ),
        State(stateName: "Alaska", abbreviation: "AK" ),
        State(stateName: "Arizona", abbreviation: "AZ"),
        State(stateName: "Arkansas", abbreviation: "AR"),
        State(stateName: "California", abbreviation: "CA"),
        State(stateName: "Colorado", abbreviation: "CO"),
        State(stateName: "Connecticut", abbreviation: "CT"),

        ]


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        filteredStates = states
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell")!
        //Access data from filteredStates array not from states array
        cell.textLabel?.text = self.filteredStates[indexPath.row].stateName
        cell.detailTextLabel?.text = self.filteredStates[indexPath.row].abbreviation
        return cell
    }

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

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        searchBar.showsCancelButton = true
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        self.filteredStates = searchText.isEmpty ? states : states.filter( { [=10=].stateName.localizedCaseInsensitiveContains(searchText) })
        self.tableView.reloadData()
    }
    func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
        searchBar.resignFirstResponder()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchBar.resignFirstResponder()
        searchBar.showsCancelButton = false
        searchBar.text = ""
        self.filteredStates = states
        self.tableView.reloadData()
    }
}

注意:我还没有添加你正在使用的代码 TapGesture 所以不要忘记添加它。