Как изменить фон ячейки, когда имя содержит текст в строке поиска? - PullRequest
0 голосов
/ 13 января 2020

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

Я пробовал этот код с помощью комментариев, но все еще не могу понять:

let allElements = ["Hydrogen", "Helium", ...]

var searchElement = [String]()
var searching = false
var myIndex = 0

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

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

    if indexPath.row == 0 {

        let hydrogenSearchSegue = UIStoryboard(name:"Main", bundle:nil).instantiateViewController(withIdentifier: "hydrogenView") as! hydrogenViewController

        self.navigationController?.pushViewController(hydrogenSearchSegue, animated:true)




     }

}

}


extension searchViewController: UITableViewDataSource, UITableViewDelegate {

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

    if searching == true {

        return searchElement.count

    } else {

        return allElements.count

    }

}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

    if searching == true {

        cell?.textLabel?.text = searchElement[indexPath.row]

    } else {

        cell?.textLabel?.text = allElements[indexPath.row]

    }

    return cell!

}

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    let string = allElements[indexPath.row]

    if searchElement.contains(string) {

        cell.backgroundColor = UIColor.red

    } else {

        cell.backgroundColor = UIColor.white

    }

}

}

extension searchViewController: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

        searchElement = allElements.filter({$0.lowercased().prefix(searchText.count) == searchText.lowercased()})
        searching = true
        tableView.reloadData()

    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {

        _ = navigationController?.popViewController(animated: true)
        searchBar.text = ""
        tableView.reloadData()

    }

}

Цель состояла в том, чтобы попытаться использовать .filter для разделения ячеек которые не содержат текст панели поиска с тем, что делает. Затем измените цвет ячейки, если она содержит этот текст.

1 Ответ

4 голосов
/ 13 января 2020

Это то, что вы можете сделать.

вы можете фильтровать ваш массив поиска при каждом изменении в тексте поиска.

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

//here searchElement is your searched array. and allElements is your main array
         searchElement = allElements.filter({$0.lowercased().prefix(searchText.count) 
// or your filter logic whatever it is. 

//and then you refresh your tableview here
myTableView.reloadData()
 }

и в willDisplayCell вы делаете это

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    let string = allElements[indexPath.row]
//if your search array contains the current cell, then you can show the cell as highlighted.
    if searchElement.contains(string) {
        cell.backgroundColor = UIColor.red
    }else {
        cell.backgroundColor = UIColor.white
    }
//But make sure to empty your search array in case you are not searching.

}

И для сброса это, вы можете установить свой массив searchElements пустым.

// ПРИМЕЧАНИЕ: метод willDisplay не должен go внутри textDidChange метода

...