在 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 和数组过滤器自动完成文本字段的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用数组创建 TableView

Swift 使用数组修改 Tableviews

使用数组中的新信息更新该对象并显示 tableview Swift

Swift 3.0:在 TableView 的 UserDefaults 中存储数组

如何在 swift 中的 tableview 中的 numberOfRowsInSection 中比较和显示不同的数组计数

我如何使用解码器在swift 4中解析tableview中的json数组