Swift SearchBar Filtering&更新多个阵列

时间:2017-01-20 08:06:06

标签: ios arrays swift uitableview uisearchbar

我需要实现一个搜索和搜索的搜索栏。过滤带有2个标签的tableview。标签数据来自2个不同的阵列。因此,当我过滤数组1 /标签1时,它会过滤,但标签2保持相同,因此结果是混合的。两个数组都是在具有2列数据的SQL Query结果之后创建的。我的意思是arr1 [0]和arr2 [0]是同一行但不同的列。经过太多尝试,我被困住了。这是最新的代码:

var arr1 = [String]()
var arr2 = [String]()
var filtered:[String] = []

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if(searchActive) {
        return filtered.count
    } else {
        return arr1.count
    }
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> xxTableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "xxCell", for: indexPath) as! xxTableViewCell

    if(searchActive){

        cell.label1.text = filtered[(indexPath as NSIndexPath).row]

    } else {

        cell.label1.text = arr1[(indexPath as NSIndexPath).row]
        cell.label2.text = arr2[(indexPath as NSIndexPath).row]

    }
    return cell
}

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

    filtered = arr1.filter({ (text) -> Bool in
        let tmp: NSString = text as NSString
        let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
        return range.location != NSNotFound
    })
    if(filtered.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }


    self.tableView.reloadData()
}

2 个答案:

答案 0 :(得分:2)

如果arr1 []和arr2 []是单行数据的两列,那么您应该有一个数组。有很多方法可以做到这一点 - 元组,类,结构 - 但我倾向于使用结构。如果您有其他想要执行的处理,可以更好地实现为类,但同样的原则适用。

定义您需要的结构

struct MyDataStruct
{
    var label1 : String = ""
    var label2 : String = ""
}

然后定义这种类型的数组(而不是arr1,arr2)

var myData = [MyDataStruct]()

然后像以前一样构建数据和搜索数组 - 但是进入这个单一结构

myData.append(MyDataStruct(label1: "Hello", label2: "World"))

最后一步是在tableView方法

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> xxTableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "xxCell", for: indexPath) as! xxTableViewCell

    if(searchActive){
        cell.label1.text = filtered[indexPath.row].label1
    } else {
        cell.label1.text = myData[indexPath.row].label1
        cell.label2.text = myData[indexPath.row].label2 
    }
    return cell
}

答案 1 :(得分:1)

问题:searchActive = true时,您label2.text中的cellForRow没有任何价值。因此,只要您在过滤器刚刚更新label1的新值时重新加载tableView。

解决方案:

像这样修改你的代码。

if(searchActive){

    cell.label1.text = filtered[(indexPath as NSIndexPath).row]
    cell.label2.text = @"" //assign value to label2 after filter 
} else {

    cell.label1.text = arr1[(indexPath as NSIndexPath).row]
    cell.label2.text = arr2[(indexPath as NSIndexPath).row]

}