[英]Autocomplete textfield using tableview and array filter in swift
因此,我有一個tableview,一個文本字段和一個包含一些數據的數組。 我想要實現的是,每當我開始在文本字段中鍵入內容時,都會在包含數據的數組上觸發filter()方法,而tablview應該返回與我在文本字段中鍵入的字符匹配的數據。
例如,如果我輸入W,則結果應為“ Walmart”,“ Wally”,“ Wily”,依此類推;如果輸入“ Sac”,則應給出“薩克拉門托”,“滿意”等。 ,一個自動完成的文本字段,完全不使用任何外部庫。
我知道這很簡單,我已經嘗試過這樣做,但是我得到的數據為零。此外,我還是新手。 請幫助任何人:-)
看這個鏈接
就我而言,這是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()
}
大聲笑我是菜鳥,但我正在回答我自己的問題。 這里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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.