簡體   English   中英

快速使用TableView和數組過濾器自動完成文本字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM