【问题标题】:How to filter multiple fields in UITableView in swift如何快速过滤UITableView中的多个字段
【发布时间】:2015-09-16 19:17:45
【问题描述】:

我在 字符串数组中有国家代码和国家名称。 我只是过滤了国家名称并显示在过滤后的 tableView 中。但是,在显示时,我无法从原始 tableview 中获取相应的国家代码。国家/地区代码未过滤。请帮助我。如何过滤 tableView 单元格中的多个字段。

我的代码:

var countries = [String]()
for countryCodes : AnyObject in NSLocale.ISOCountryCodes() {
    let dictionary : NSDictionary = NSDictionary(object:countryCodes, forKey:NSLocaleCountryCode)
    let identifier : NSString? = NSLocale.localeIdentifierFromComponents(dictionary)
    if ((identifier) != nil) {
        let country : NSString = NSLocale.currentLocale().displayNameForKey(NSLocaleIdentifier, value: identifier!)!
        countries.append(country)
        println(countries)
    }
}
println(countries)
var country_codes = [String]()
country_codes =  NSLocale.ISOCountryCodes() as [String]
println(country_codes) //Working Successfully.

//SEARCH BAR WHILE TYPING TEXT
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {

        if(countElements(searchBar.text) >= 3)
        {
            searchActive = true

            filtered = countries.filter({ (text) -> Bool in
                let tmp: NSString = text
                let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
                return range.location != NSNotFound
            })
//I filtered only one fields. So, Filtered results are working fine, but, I am having one more fields in tableview cell. That is displaying different datas. I dont know how to filtered multiple fields.
            if(filtered.count == 0 || countElements(searchBar.text) == 0)
            {
                searchActive = false
                self.countryTableView.reloadData()
            }
            else
            {
                searchActive = true
                self.countryTableView.reloadData()
            }

        }
        else
        {

            searchActive = false
            self.countryTableView.reloadData()
        }

    }

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = countryTableView.dequeueReusableCellWithIdentifier("country", forIndexPath: indexPath) as country_tblCell

        //println("Cell for ROws \(searchActive)")
        if(searchActive)
        {
            if(filtered.count == 0 || countElements(searchBar.text) == 0)
            {
                searchActive = false
                self.countryTableView.reloadData()
            }

            else
            {
                println("First Index \(indexPath.row)")
                cell.country_Label.text = filtered[indexPath.row]
                cell.countryCodeLabel.text = countryCodes[indexPath.row] //Here need to display filtered datas for Country code.
                println("Second Index \(indexPath.row)")
            }
        }
        else
        {
            println("Normal First Index \(indexPath.row)")
            cell.selectionStyle = .None
            cell.country_Label.text = countries[indexPath.row]
            cell.countryCodeLabel.text = countryCodes[indexPath.row]
            cell.layer.borderColor = validateBorderColor.CGColor
            cell.layer.borderWidth = 1
            println("Normal Second Index \(indexPath.row)")
        }

        return cell
    }

我的输出

【问题讨论】:

    标签: swift uitableview uisearchbar


    【解决方案1】:

    尝试使用元组。

    这是 swift 的一个很棒的功能。

    得到countriescountry_codes

    将它们添加到这个元组中

    var countryAndCode: [(country:String , code: String)] = []
    for i in 0...coutries.count {
      countryAndCode.append(country:countries[i] , code:country_codes[i])//this shows error in XCode some times
        //if the above code doesn't compile then use the below code
      countryAndCode += [(country:countries[i] , code:country_codes[i])]
    }
    

    然后对这个元组进行过滤:

    filtered = countryAndCode.filter({ (data) -> Bool in
            let tmp: NSString = data.country // the name from the variable decleration
                let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
                return range.location != NSNotFound
            })
    

    最后在cellForRowAtIndexPath方法中使用这个元组

    cell.country_Label.text = filtered[indexPath.row].country
    cell.countryCodeLabel.text = filtered[indexPath.row].code
    

    有关元组的更多信息,您可以访问http://www.raywenderlich.com/75289/swift-tutorial-part-3-tuples-protocols-delegates-table-views

    【讨论】:

    • 谢谢@Raja。让 tmp: NSString = data.country 。这条线我看不懂?
    • 我在问“data.country”
    • "filtered = countryAndCode.filter",,在这一行我得到了一个错误。 (country:String , code: String) 与 String 不同
    • @McDonal_11 对象名称为country。因此,将来要引用元组的国家/地区部分,我们使用这个名称来称呼它:countryAndCode[1].country。在这里,使用.filter 方法进行过滤时,我们将数组的每个对象作为一个元组并将其分配给data。所以要访问我们使用的元组的country 部分data.country
    • 是的@Raja !!我明白了。 “filtered = countryAndCode.filter”,在这一行我得到了一个错误。 (国家:字符串,代码:字符串)与字符串不同。我不知道你收到了这个错误?
    【解决方案2】:

    我之前也遇到过类似的问题。我猜第一步是一样的。创建一个元组,其中国家和代码在一个对象中。

    var countryAndCode: [(country:String , code: String)] = []
    

    然后我基本上对字段使用了 OR 运算符。你的代码:

            filtered = countries.filter({ (text) -> Bool in
                let tmp: NSString = text.attribute
                let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
                return range.location != NSNotFound
            })
    

    变成这样:

            filtered = countries.filter({ (text) -> Bool in
                let tmp: NSString = text.attribute
                let range = tmp.country.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) || tmp.code.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
                return range.location != NSNotFound
            })
    

    在你的情况下,如果你想过滤两个字段,你可以做 &&。

    【讨论】:

    • 如何在不指定属性的情况下使用 let tmp: NSString = text?如果我不使用 text.attributeName 会出现错误
    • 我击中无法将类型“(进程:字符串,请求者:字符串,创建:字符串,状态:字符串)”的值转换为指定类型“NSString”
    • 因此您在国家/地区数组中的对象是一个字符串,但 clojure 需要 NSString 并且显然无法转换。不过已经有一段时间了。
    • 看这个问题+答案:stackoverflow.com/questions/29448152/…
    【解决方案3】:

    Swift 3.0 中的上述答案

    var countryAndCode: [(country:String , code: String)] = []
    for i in 0...coutries.count-1 {
      countryAndCode += [(country:countries[i] , code:country_codes[i])]
    }
    

    然后对这个元组进行过滤:

    filtered = countryAndCode.filter({ (data) -> Bool in
         let tmp: NSString = data.country // the name from the variable decleration
         let range = tmp.range(of: searchText, options: .caseInsensitive)
         return range.location != NSNotFound
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2015-01-16
      • 2021-02-10
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多