Solución:
Crear objeto uitextfield:
@IBOutlet var SearchTxt: UITextField!
var search:String=""
@IBOutlet var ListTable: UITableView!
var AllData:Array<Dictionary<String,String>> = []
var SearchData:Array<Dictionary<String,String>> = []
Viewdidload:
override func viewDidLoad()
{
super.viewDidLoad()
AllData = [["pic":"list0.jpg", "name":"Angel Mark", "msg":"Hi there, I would like read your...", "time":"just now", "unread":"12"],
["pic":"list1.jpg", "name":"John Doe", "msg":"I would prefer reading on night...", "time":"56 second ago", "unread":"2"],
["pic":"list2.jpg", "name":"Krishta Hide", "msg":"Okey Great..!", "time":"2m ago", "unread":"0"],
["pic":"list3.jpg", "name":"Keithy Pamela", "msg":"I am waiting there", "time":"5h ago", "unread":"0"]
]
SearchData=AllData
}
Buscar en el método delegado de campo de texto:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
if string.isEmpty
{
search = String(search.characters.dropLast())
}
else
{
search=textField.text!+string
}
print(search)
let predicate=NSPredicate(format: "SELF.name CONTAINS[cd] %@", search)
let arr=(AllData as NSArray).filtered(using: predicate)
if arr.count > 0
{
SearchData.removeAll(keepingCapacity: true)
SearchData=arr as! Array<Dictionary<String,String>>
}
else
{
SearchData=AllData
}
ListTable.reloadData()
return true
}
Visualización de datos de búsqueda en vista de tabla:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return SearchData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell
var Data:Dictionary<String,String> = SearchData[indexPath.row]
cell.Pic.image=UIImage(named: Data["pic"]!)
cell.Name.text = Data["name"]
cell.Msg.text = Data["msg"]
cell.Time.text = Data["time"]
cell.selectionStyle = .none
return cell
}
Su pregunta principal parece ser cómo implementar una clase que funcione como UISearchBar. ¡Eso sería una gran empresa!
Sin embargo, en sus notas solo pregunta cómo reaccionar cuando se toca el botón de búsqueda.
Agregue una IBAction y una segunda matriz a su controlador de vista. Llame a la segunda matriz algo así como “elementos encontrados”. Conecte la IBAction al botón de búsqueda. Cuando se llama a la acción, lea el texto del campo de texto y filtre los elementos según ese texto. Coloque los elementos que se ajustan al filtro en la matriz foundItems, luego llame a reloadData () en su vista de tabla.
En sus métodos de fuente de datos de vista de tabla, verifique si foundItems no es nil. Si no es así, muéstrelos en lugar de su matriz de elementos principales.
También necesitará algún tipo de botón de cancelación. En la acción de ese botón, anule la matriz foundItems y llame a reloadData () en su vista de tabla.
Xcode 9.2 / Swift 4 – Código de trabajo
@IBOutlet var tfSearchWorker: UITextField!
@IBOutlet var tblView: UITableView!
var AllData :Array<Dictionary<String,String>> = []
var SearchedData:Array<Dictionary<String,String>> = []
@ViewDidLoad
AllData = [["pic":"list0.jpg", "name":"Angel Mark", "msg":"Hi there, I would like read your...", "time":"just now", "unread":"12"],
["pic":"list1.jpg", "name":"John Doe", "msg":"I would prefer reading on night...", "time":"56 second ago", "unread":"2"],
["pic":"list2.jpg", "name":"Krishta Hide", "msg":"Okey Great..!", "time":"2m ago", "unread":"0"],
["pic":"list3.jpg", "name":"Keithy Pamela", "msg":"I am waiting there", "time":"5h ago", "unread":"0"]
]
self.SearchedData = self.AllData
self.tfSearchWorker.addTarget(self, action: #selector(searchWorkersAsPerText(_ :)), for: .editingChanged)
@Función
@objc func searchWorkersAsPerText(_ textfield:UITextField) {
self.SearchedData.removeAll()
if textfield.text?.count != 0 {
for dicData in self.AllData {
let isMachingWorker : NSString = (dicData.name!) as NSString
let range = isMachingWorker.lowercased.range(of: textfield.text!, options: NSString.CompareOptions.caseInsensitive, range: nil, locale: nil)
if range != nil {
SearchedData.append(dicData)
}
}
} else {
self.SearchedData = self.AllData
}
self.tblView.reloadData()
}
@UITableView
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.SearchedData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell
var Data:Dictionary<String,String> = SearchedData[indexPath.row]
cell.Pic.image=UIImage(named: Data["pic"]!)
cell.Name.text = Data["name"]
cell.Msg.text = Data["msg"]
cell.Time.text = Data["time"]
cell.selectionStyle = .none
return cell
}