使用swift中的tableview和数组过滤器自动完成文本字段

时间:2018-04-02 10:33:07

标签: ios arrays iphone swift uitableview

所以,我有一个tableview,一个textfield和一个包含一些数据的数组。我想要实现的是,每当我开始在文本字段中输入时,filter()方法应该触发包含数据的数组,并且tablview应该返回与我在文本字段中键入的字符匹配的数据。

例如,如果我输入W,它应该给我结果" Walmart"," Wally," Wily"等等。如果我输入" Sac"它应该给予" sacramento","满意"等等。简而言之,一个自动完成的文本字段,根本不使用任何外部库。

我知道这很简单,我已经尝试过这样做,但我得到零数据。此外,我是新手。请帮助任何人:-)

2 个答案:

答案 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。