所以,我有一个tableview,一个textfield和一个包含一些数据的数组。我想要实现的是,每当我开始在文本字段中输入时,filter()方法应该触发包含数据的数组,并且tablview应该返回与我在文本字段中键入的字符匹配的数据。
例如,如果我输入W,它应该给我结果" Walmart"," Wally," Wily"等等。如果我输入" Sac"它应该给予" sacramento","满意"等等。简而言之,一个自动完成的文本字段,根本不使用任何外部库。
我知道这很简单,我已经尝试过这样做,但我得到零数据。此外,我是新手。请帮助任何人:-)
答案 0 :(得分:0)
看看这个link
对于我的情况,这是一个UISearchbar的解决方案。我正在获得一个字典数组&执行搜索
//MARK:- search items & reload table
func filter(array : [[String : [MyModel]]], byString filterString : String) {
let searchByNamesArray = array.filter { $0.values.contains { $0.contains { $0.nameString.lowercased().contains(filterString.lowercased())} } }
//Assign searched array into arrayOfMerchants
self.arrayOfItems = searchByNamesArray
//Reload table with new Data
self.merchantTableView.reloadData()
}
对于搜索条形码
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
if !((searchBar.text?.isEmpty)!){
filter(array: self.arrayOfItems, byString: searchBar.text!)
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if (searchBar.text?.isEmpty)! //in case there is no text in Searchbar, reload all record
{
self.arrayOfItems = self.arrayOfRecordsHolding //array of original record holder
self.merchantTableView.reloadData()
}
else
{
self.arrayOfItems = self.arrayOfRecordsHolding
filter(array: self.arrayOfMerchants, byString: searchBar.text!)
}
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
//reload all data when cancel button pressed on searchbar
self.arrayOfItems = self.arrayOfRecordsHolding
searchBar.text = ""
self.merchantTableView.reloadData()
searchBar.resignFirstResponder()
}
答案 1 :(得分:0)
LOl我是一个菜鸟,但我正在回答我自己的问题。这里arrStoreNameFilteredData和arrStoreName都是包含相同对象类型数据的数组。但是,只要用户开始在文本字段中键入字符,arrStoreNameFilteredData将包含将被过滤掉的数据。
if textField.text?.isEmpty == true && string.isEmpty == true
{
textField.text = ""
arrStoreNameFilteredData = arrStoreName
tblData.reloadData()
}
else
{
tblData.isHidden = false
let substring = (textField.text! as NSString).replacingCharacters(in: range, with: string)
print("Substring : \(substring)")
arrStoreNameFilteredData = arrStoreName.filter({ (store: Stores) -> Bool in
return ((store.storeName?.lowercased())?.contains(substring.lowercased()))!
})
tblData.reloadData()
}
当您使用“$ 0”时,过滤器谓词不能正常工作..而是使用别名变量。这里,store是一个对象类型Stores的变量,它会在我输入每个字符时过滤掉数据。
((store.storeName?.lowercased())?.contains(substring.lowercased()))!
以上一行是让它对我有用的:-D。感谢所有回复我帖子的人,没有他们,我就无法发表自己的答案:-D。