如何使用UISearchBar过滤[[String:String]]类型的数组并显示为String

时间:2018-07-11 12:40:39

标签: ios swift uitableview uisearchbar

我已经解析了一个JSON数组,该数组为我提供了[[String:String]],然后将其放入表格视图中。

我想使用UISearchBar来搜索数据,但是遇到麻烦,因为我不确定如何处理[[String:String]]格式。

我尝试创建另一个变量,该变量将数组数据保存为[String],并且可以对其进行过滤,但是无法正确显示结果。抱歉,这有点令人困惑,因为我在最近几个小时内一直想弄清楚自己,使我感到困惑。谢谢!

import UIKit
import Alamofire
import SwiftyJSON

class StartViewController: UIViewController, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource {

    var names = [
        [String: String]
        ]()

    var isSearching = false
    var filteredData = [String]()


    @IBOutlet weak
    var tableView: UITableView!

    @IBOutlet weak
    var searchBar: UISearchBar!

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
                                                 for: indexPath)
        let name = names[indexPath.row]
        let text: String!

        // here I get 'Cannot assign value of type '[String : String]' to type 'String?''
        if isSearching {
            text = filteredData[indexPath.row]

        } else {
            text = nil
        }

        cell.textLabel ? .text = name["name"]
        cell.textLabel ? .textColor = UIColor.blue

        return cell
    }
}

这里有两个部分

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    if searchBar.text == nil || searchBar.text == "" {

        isSearching = false

        view.endEditing(true)

        tableView.reloadData()
    } else {
        isSearching = true

        // and here I get 'Binary operator '==' cannot be applied to operands of type '[String : String]' and 'String?''
        filteredData = names.filter({
            $0 == searchBar.text
        })

        tableView.reloadData()
    }
}

感谢您的帮助。

编辑: //这是我的解析函数,如果有帮助的话

func parse(json: JSON) {
    for result in json[].arrayValue {
        let name = result["name"].stringValue
        let obj = ["name": name]

        names.append(obj)

    }
    tableView.reloadData()
}

}

1 个答案:

答案 0 :(得分:0)

要同时显示完整数据和过滤后的数据,两个阵列必须具有相同的类型。

var filteredData = [[String:String]]()

cellForRow中使用取决于isSearching的数组

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
                                             for: indexPath)

    let text : [String:String]
    if isSearching {
        text = filteredData[indexPath.row]
    } else {
        text = names[indexPath.row]
    }

    cell.textLabel?.text = text["name"]
    cell.textLabel?.textColor = UIColor.blue

    return cell
}

searchBar:searchDidChange中,您必须按一个键进行过滤

filteredData = names.filter({
     $0["name"] == searchBar.text
})

但是我建议使用自定义类或结构而不是字典。