在 swift 中使用 tableview 和数组过滤器自动完成文本字段
Posted
技术标签:
【中文标题】在 swift 中使用 tableview 和数组过滤器自动完成文本字段【英文标题】:Autocomplete textfield using tableview and array filter in swift 【发布时间】:2018-04-02 10:33:06 【问题描述】:所以,我有一个 tableview 、一个文本字段和一个包含一些数据的数组。我想要实现的是,每当我开始在文本字段中输入时,应该在包含数据的数组上触发 filter() 方法,并且 tablview 应该返回与我在文本字段中输入的字符匹配的数据。
例如,如果我输入 W,它应该给我的结果是“Walmart”、“Wally”、“Wily”等等。如果我输入“Sac”,它应该给我“sacramento”、“satisfied”等等. 简而言之,一个完全不使用任何外部库的自动完成文本字段。
我知道这很简单,我已经尝试过,但我得到的数据为零。另外,我是 swift 新手。请帮助任何人:-)
【问题讨论】:
我尝试在包含数据的数组上使用过滤器,然后重新加载我的表格视图。但是,我得到 0 个元素。您能否给我一个简短的代码 sn-p 就像我可以参考的概述一样? 这是我为 tableview 制作的库,您可以为您的项目引用它的代码github.com/insideApple/VPAutoComplete 谢谢..但我昨天想出了怎么做!但是感谢您的帮助:-D @vp2698 【参考方案1】:看看这个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()
【讨论】:
你能解释一下这行吗?let searchByNamesArray = array.filter $0.values.contains $0.contains $0.nameString.lowercased().contains(filterString.lowercased())
MyModel 有一个实例“nameString”。我正在根据名称进行搜索。 $0.nameString.lowercased().contains(filterString.lowercased()) 语句检查'nameString'是否包含'filterString'
感谢您的解决方案..它有效,但我必须将 $0 变量修改为我的对象类型,然后它有效:-) 谢谢@Gagan_ios【参考方案2】:
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。
【讨论】:
以上是关于在 swift 中使用 tableview 和数组过滤器自动完成文本字段的主要内容,如果未能解决你的问题,请参考以下文章
使用数组中的新信息更新该对象并显示 tableview Swift
Swift 3.0:在 TableView 的 UserDefaults 中存储数组
如何在 swift 中的 tableview 中的 numberOfRowsInSection 中比较和显示不同的数组计数