Поиск имени или номера в `UISearchbar` - PullRequest
0 голосов
/ 30 марта 2019

В tableViewCell У меня есть userNameLbl с именем, userClgLbl с номером. Я хочу искать и показывать данные в tableView либо по имени, либо по номеру.

Если пользователь ищет имя - по имени, я могу показать данные в tableView.
Если пользовательский номер поиска - на основе номера, я могу показать данные в tableView.

Но как работать с именем и номером для одной строки поиска. На самом деле здесь мои данные являются динамическими с сервера, и номер не является номером телефона.

UISearchBarDelegate добавлено в мой класс

let searchBar = UISearchBar()
var filteredData: [Any]!
@IBOutlet weak var listTblView: UITableView!

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

    return filteredData.count
}

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

    // create a new cell if needed or reuse an old one
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell


    cell.userNameLbl.text = filteredData[indexPath.row] as? String
    cell.userClgLbl.text = clg_uniq[indexPath.row] as? String

    return cell

} 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    let strArr:[String] = clg_uniq as! [String]
    filteredData = searchText.isEmpty ? clg_uniq : strArr.filter({(dataString: String) -> Bool in
        // If dataItem matches the searchText, return true to include it
        return dataString.range(of: searchText, options: .caseInsensitive) != nil
    })

    DispatchQueue.main.async {
        self.listTblView.reloadData()
    }
    if searchText == "" {
        DispatchQueue.main.async {
            searchBar.resignFirstResponder()
        }
    }
}

//Added these lines after json parsing 
self.filteredData = self.clg_uniq
self.listTblView.reloadData()

Мой пример данных JSON:

{"log" =     (
            {
        Name = "Name1";
        "clg_uniq" = 5c640e7b86e35;
    },
            {
         Name = "Name2";
        "clg_uniq" = <null>;
    },
            {
         Name = <null>;
        "clg_uniq" = 5c647af5d5c4d;
    },
            {
         Name = "Name4";
        "clg_uniq" = 5c647a0427253;
    },
            {
         Name = <null>;
        "clg_uniq" = <null>;
    },
            {
         Name = "Name6";
        "clg_uniq" = $cuniq";
    },
 )
}

1 Ответ

1 голос
/ 30 марта 2019

Добавить следующие переменные -

var logArray = [Dictionary<String, Any>]() // For all result
var searchedLogArray = [Dictionary<String, Any>]() // For filtered result
var searchActive = false // whenever user search anything

Заменить UISearchBarDelegate -

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

    searchActive = searchText.count > 0 ? true : false

    let namePredicate = NSPredicate(format: "Name CONTAINS[c] %@", searchText)
    let clgUniqPredicate = NSPredicate(format: "clg_uniq CONTAINS[c] %@", searchText)

    let compoundPredicate = NSCompoundPredicate.init(orPredicateWithSubpredicates: [namePredicate, clgUniqPredicate])

    searchedLogArray = logArray.filter({
        return compoundPredicate.evaluate(with: $0)
    })

    listTblView.reloadData()

}

Заменить UITableViewDataSource -

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

    return searchActive ? searchedLogArray.count : logArray.count
}

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

    // create a new cell if needed or reuse an old one
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell

    let logDict = searchActive ? searchedLogArray[indexPath.row] : logArray[indexPath.row]

    // Name
    if let name = log["Name"] as? String{

      cell.userNameLbl.text = name

    }else{

      cell.userNameLbl.text = ""

    }


    // clg_uniq
    if let clgUniq = log["clg_uniq"] as? String {

         cell.userClgLbl.text = clgUniq

    }else{

         cell.userClgLbl.text = ""

    }


    return cell

}

Я надеюсь, что вы продолжаете отвечать как Dictionary<String, Any>

Дайте мне знать, если у вас все еще есть проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...