具有多个数据的Swift搜索栏

问题描述 投票:1回答:2

我有5个标签,它们从tableView上的每个单元格中的SQL Query数组中接收数据。我想在它上面实现搜索栏。搜索栏应搜索1个特定标签的数据。它正在工作并过滤特定标签,但是当它被过滤时,其他4个标签将不会更新,它们根本不会更改。我无法弄清楚。由于我只有1个来自搜索栏条目的过滤数据,我不知道应该如何过滤其他数据。谢谢

编辑:仍然无法弄清楚类和添加数据,我有一个错误

“类型'[String]'的值没有成员'localizedCaseInsensitiveContains'”

在搜索栏功能

import UIKit

class TableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {

var data:[MyData] = []
@IBOutlet weak var searchBar: UISearchBar!
var searchActive : Bool = false
var filtered:[MyData] = []

@IBAction func sqlExecute(_ sender: AnyObject) {

var client = SQLClient()
    client.connect("sql_ip", username: "username", password: "password", database: "database") {
        success in

        if success {
            client.execute("sql query") {
                result in

                for table in result as Any as! NSArray {
                    for row in table as! NSArray {
                        for column in row as! NSDictionary {

                            if column.key as! String == "data1" {
                                MyData.init(data1: "\(column.value)")
                            } else if column.key as! String == "data2" {
                                MyData.init(data2: column.value as! Double)
                            } else if column.key as! String == "data3" {
                                MyData.init(data3: "\(column.value)")
                            } else if column.key as! String == "data4" {
                                MyData.init(data4: "\(column.value)")
                            } else if column.key as! String == "data5" {
                                MyData.init(data5: "\(column.value)")
                            }
                        }
                    }
                }
                client.disconnect()
                self.tableView.reloadData()
            }
        }
    }
}
override func viewDidLoad() {
    super.viewDidLoad()


    tableView.delegate = self
    tableView.dataSource = self
    searchBar.delegate = self
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}


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 data.count
    }
}


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

    if(searchActive) {

        cell.label1.text = "\(filtered[indexPath.row])"
        cell.label2.text = "\(filtered[indexPath.row])"
        cell.label3.text = "\(filtered[indexPath.row])"
        cell.label4.text = "\(filtered[indexPath.row])"
        cell.label5.text = "\(filtered[indexPath.row])"
    } else {

    cell.label1.text = "\(data[indexPath.row])"
    cell.label2.text = "\(data[indexPath.row])"
    cell.label3.text = "\(data[indexPath.row])"
    cell.label4.text = "\(data[indexPath.row])"
    cell.label5.text = "\(data[indexPath.row])"
    }
    cell.backgroundColor = UIColor.clear
    cell.selectionStyle = UITableViewCellSelectionStyle.none
    return cell
}


func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    searchActive = true;
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    searchActive = false;
    self.searchBar.endEditing(true)
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false;
    self.searchBar.endEditing(true)
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    searchActive = false;
    self.searchBar.endEditing(true)
}

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

    filtered = data.filter { $0.data1.localizedCaseInsensitiveContains(searchText) }
    if(filtered.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }
    self.tableView.reloadData()
}

这是类文件:

import Foundation

class MyData {
var data1 = [String]()
var data2 = [Double]()
var data3 = [String]()
var data4 = [String]()
var data5 = [String]()


init(data1: String) {
    self.data1.append(data1)
}
init(data2: Double) {
    self.data2.append(data2)
}
init(data3: String) {
    self.data3.append(data3)
}
init(data4: String) {
    self.data4.append(data4)
}
init(data5: String) {
    self.data5.append(data5)
}
}
ios swift swift3 tableview searchbar
2个回答
3
投票

你的问题是你有五个不同的数组而不是你需要有一个类型Dictionary或自定义Struct / class的数组。如果你像这样使用struct / class,那就太棒了。

class MyData {
    var data1: String!
    var data2: Double!
    var data3: String!
    var data4: String!
    var data5: String! 

    init(data1: String, data2: Double, data3: String, data4: String, data5: String) {
         self.data1 = data1
         self.data2 = data2
         self.data3 = data3
         self.data4 = data4
         self.data5 = data5
    }
}

现在,而不是有五个不同的数组和一个用于过滤器创建两个类型为Array[MyData],其中一个用于显示filterData并使用tableView方法并像这样过滤它。

使用MyData方法创建init的对象并将其附加到数据Array然后像这样过滤你的searchBar委托。

filtered = data.filter { $0.data1.localizedCaseInsensitiveContains(searchText) }

上面的过滤器将在数据数组中搜索并返回属性data1包含searchText的所有对象。

你的整个代码都是这样的

import UIKit

class TableViewController: UITableViewController, UISearchBarDelegate, UISearchDisplayDelegate {

    var data:[MyData] = []

    @IBOutlet weak var searchBar: UISearchBar!
    var searchActive : Bool = false
    var filtered:[MyData] = []


    override func viewDidLoad() {
        super.viewDidLoad()


        tableView.delegate = self
        tableView.dataSource = self
        searchBar.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    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 data.count
        }
    }


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

        if(searchActive) {

            cell.label1.text = filtered[indexPath.row].data1
            cell.label2.text = filtered[indexPath.row].data2
            cell.label3.text = filtered[indexPath.row].data3
            cell.label4.text = "\(filtered[indexPath.row].data4) ₺"
            cell.label5.text = filtered[indexPath.row].data5
        } else {

            cell.label1.text = data[indexPath.row].data1
            cell.label2.text = data[indexPath.row].data2
            cell.label3.text = data[indexPath.row].data3
            cell.label4.text = "\(data[indexPath.row].data4) ₺"
            cell.label5.text = data[indexPath.row].data5
        }
        cell.backgroundColor = UIColor.clear
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        return cell
    }


    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        searchActive = true;
    }

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        searchActive = false;
        self.searchBar.endEditing(true)
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchActive = false;
        self.searchBar.endEditing(true)
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchActive = false;
        self.searchBar.endEditing(true)
    }

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

        filtered = data.filter { $0.data1.localizedCaseInsensitiveContains(searchText) }
        if(filtered.count == 0){
            searchActive = false;
        } else {
            searchActive = true;
        }
        self.tableView.reloadData()
    }
}

编辑:你需要像这样使用单个数组。

for table in result as Any as! NSArray {
    for row in table as! NSArray {
        if let dic = row as? [String : Any] {
            let data1 = dic["data1"] as! String
            let data2 = dic["data2"] as! Double
            let data3 = dic["data3"] as! String
            let data4 = dic["data4"] as! String
            let data5 = dic["data5"] as! String
            let newData =  MyData(data1: data1, data2: data2, data3: data3, data4: data4, data5: data5)
            self.data.append(newData)
        }
    }
}
self.tableView.reloadData()

0
投票

首先,您必须创建一个全局数组,然后在搜索栏委托中对其进行排序。

  extension  HVUserLisitingViewController  : UITableViewDelegate , UITableViewDataSource{

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

       return filterUser.count

    }
 } 
extension HVUserLisitingViewController : UISearchBarDelegate {
    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
        return true
    }
    func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {

        return true }
    func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        return true
    }
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { // called when text changes (including clear)
        webserviceSearchBy(text: searchBar.text!)
    }
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
          filterUser.removeAll()
          filterUser = users
          tableview.reloadData()
    }
    func webserviceSearchBy(text : String) {

        if text.lowercased().count == 0 {
            filterUser.removeAll()
            filterUser = users
            tableview.reloadData()
            return
        }
            filterUser.removeAll()

            filterUser = users.filter({ (user) -> Bool in


                if user.username.lowercased().range(of:text.lowercased()) != nil {

                    return true
                }
                return false
            })

            tableview.reloadData()
    }


}
© www.soinside.com 2019 - 2024. All rights reserved.