UISearchbar, использующий UItextfield в Swift 4 - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над JSON. Мои данные Json печатаются в виде таблицы. Я хочу отфильтровать эти данные с помощью панели поиска. Поэтому я поставил Textfield для использования панели поиска. Я использую ссылку с этого сайта

http://findnerd.com/list/view/How-to-create-your-own-search-bar-in-Swift-Not-using-UISearchBar/20577/

Моя панель поиска работает, но работает некорректно. Я хочу отфильтровать данные после того, как я напишу 3 слова в строке поиска. Если я напишу «Ku», то мое табличное представление останется скрытым. Если я напишу «kus» в строке поиска, то панель поиска начнет поиск и покажет мне отфильтрованные данные в табличном представлении, начатом с «kus». мой код, связанный с панелью поиска, это

struct PatientData:Decodable {
var ID : String
var dt_bod : String
var e_gender : String
var int_glcode : String
var var_email : String
var var_fname : String
var var_phoneno : String
var var_uname : String

init(userdata : [String:Any]) {
    self.ID = userdata["ID"] as! String
    self.dt_bod = userdata["dt_bod"] as! String
    self.e_gender = userdata["e_gender"] as! String
    self.int_glcode = userdata["int_glcode"] as! String
    self.var_email = userdata["var_email"] as! String
    self.var_fname = userdata["var_fname"] as! String
    self.var_phoneno = userdata["var_phoneno"] as! String
    self.var_uname = userdata["var_uname"] as! String

} 

var tabledata = [String]()
var tableFilterData = [String]()
var patientDetails = [PatientData]()

@IBAction func textfieldchanged(_ sender: Any) {
    tableview.isHidden = true
}

функция изменения символа моего текстового поля

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{

    let searchText  = textField.text! + string
    if searchText.count >= 3 {
        tableview.isHidden = false

        tableFilterData = tabledata.filter({ (result) -> Bool in
            return result.range(of: searchText, options: .caseInsensitive) != nil
        })

        print(tableFilterData)   // I got filtered data here but how to show this data into the tableview
        tableview.reloadData()
    }
    else{
        tableFilterData = []
    }
    return true
}

часть представления таблицы

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

        return patientDetails.count
     }

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell") as UITableViewCell!

    let aa = patientDetails[indexPath.row].var_fname + " , " + patientDetails[indexPath.row].dt_bod + " , " + patientDetails[indexPath.row].var_phoneno

    self.tabledata.append(aa)

        cell.textLabel?.text = aa
        cell.textLabel?.font = searchTextfield.font

    return cell
}

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Пожалуйста, используйте этот код: -

func getSearchArrayContains(_ text : String) {

    tableFilterData = tableData.filter({$0.lowercased().contains(text)})
    isSearch = true
     tableview.reloadData()
}

Для трехзначной ссылки используйте эту ссылку введите описание ссылки здесь : -

Спасибо

0 голосов
/ 01 ноября 2018

Попробуйте это:

@objc func textFieldActive() {
    tableView.isHidden = tableFilterData.count > 0 ? false : true
}

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{

    let searchText  = textField.text! + string

    if searchText.count >= 3 {
        tableView.isHidden = false

        tableFilterData = tabledata.filter({ (result) -> Bool in
            return result.range(of: searchText, options: .caseInsensitive) != nil
        })

        tableView.reloadData()
    }
    else{
        tableFilterData = []
    }

    return true
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let data = tableFilterData[indexPath.row]

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

    cell.textLabel?.text = data

    return cell
}
0 голосов
/ 01 ноября 2018

Вы можете проверить размер текста перед фильтром:

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{

    var searchText  = textField.text! + string

    if string  == "" {
        searchText = (searchText as String).substring(to: searchText.index(before: searchText.endIndex))
    }
    if searchText == "" {
        isSearch = false
        tableview.reloadData()
    }
    else{
        if searchText.count > 2 {
           getSearchArrayContains(searchText)
        }  
    }
    return true
}
...