如何快速使用TextField作为searchBar?

时间:2018-10-10 04:04:15

标签: ios swift uitextfield searchbar

我想将textField用作SearchBar作为我的应用程序。我遵循了youtube的教程,并在github获得了它的源代码。但不幸的是,它不适用于我的应用程序。我可以键入文本,但是它不能过滤我键入的任何内容。我的代码如下,供您参考。希望你能帮助我解决我的问题。非常感谢。

var participants: [Attendee]!
var filteredParticipants = [Attendee]()

override func viewDidLoad() {
    super.viewDidLoad()
    ParticipantTableView.delegate = self
    ParticipantTableView.dataSource = self
    searchAttendeesTextField.delegate = self
    searchAttendeesTextField.addTarget(self, action: #selector(searchRecords(_ :)), for: .editingChanged)
}

//MARK:- UITextFieldDelegates

   func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    searchAttendeesTextField.resignFirstResponder()
    return true
}

 //MARK: - searchRecords

   @objc func searchRecords(_ textField: UITextField) {
   self.filteredParticipants.removeAll()
    if textField.text?.count != 0 {

        for participant in participants {
            if let participantToSearch = textField.text{
                let range = participant.lastName.lowercased().range(of: participantToSearch, options: .caseInsensitive, range: nil, locale: nil)
                if range != nil {
                    self.filteredParticipants.append(participant)
                }
            }
        }
    }else {
        for participant in participants {
            filteredParticipants.append(participant)

        }
    }
    ParticipantTableView.reloadData()

}

 // MARK: TABLE VIEW DATA SOURCE

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


      return participants.count
   }



  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "FoldingCell")
    if cell == nil {
        cell = UITableViewCell(style: .default, reuseIdentifier: "FoldingCell")
    }
   // cell?.textLabel?.text = filteredParticipants[indexPath.row]
    return cell!
}

2 个答案:

答案 0 :(得分:1)

您的ParticipantTableView数据应使用filteredParticipants数组加载。

同时在participants数组中添加数据时,请在filteredParticipants数组中添加所有数据并重新加载ParticipantTableView

然后使用tableview dataSource方法:

// MARK: TABLE VIEW DATA SOURCE

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


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "FoldingCell")
    if cell == nil {
        cell = UITableViewCell(style: .default, reuseIdentifier: "FoldingCell")
    }

    let attendeeSingleData = filteredParticipants[indexPath.row]
    cell?.textLabel?.text = attendeeSingleData."The data that you want to add"
    return cell!
}

Attendee必须是您创建的结构或类,并且必须根据字段添加数据。

请不要从participants数组中删除数据,而要像在filteredParticipants数组中所做的那样继续更改数据。

还有一件事,您的tableView名称是ParticipantTableView,这不好。用lowerCamelCase作为participantTableView创建方法。

要了解更多信息,您可以浏览以下有用的网址:

答案 1 :(得分:0)

您好,您需要使用TextField Delegate方法。 你可以用这个

func textFieldDidBeginEditing(_ textField: UITextField) {
    //you will get here updated entered text
    print("TextField did begin editing method called", textField.text)
}