如何在swift中有效地过滤具有对象属性的搜索?

时间:2018-01-03 00:44:28

标签: ios swift xcode uitableview array-filter

嘿,我们已经搜索了几个小时,仍然无法找到一种正确的方法来搜索我的数据库。我有一组具有用户名和名称属性的联系人对象,我有一个"添加用户"查看控制器,其中 GOAL 将循环遍历我的数据库中的所有用户,并且在搜索时,它使UITABLEVIEW中的用户萎缩,这是我到目前为止所拥有的。

以下代码的Cliff说明

我从我的数据库中获取所有用户对象,并将它们存储在一个名为"结果"的类型为[contact]的数组中。 (自定义对象)然后我尝试过滤结果并将它们存储到一个名为" filteredData"联系人有类型" userName" (字符串)我想通过

过滤结果
import UIKit
import Firebase
class SearchForUsersViewController: UIViewController {

@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!

var results = [Contact]()
var filteredData = [Contact]()
var isSearching = false;

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    searchBar.delegate = self;

    searchBar.returnKeyType = UIReturnKeyType.done
    getUserList()
}

@IBAction func dismiss(_ sender: Any) {
    dismiss(animated: true, completion: nil)
}

func getUserList(){
    //populates results
    staticValuesForData.instance.dataBaseUserref.observe( .value) { (snapshot) in
        if let userList = snapshot.children.allObjects as? [DataSnapshot]{
            for user in userList{
                 let name = (user.childSnapshot(forPath: staticValuesForData.instance.fName).value as! String) + " "
                    + (user.childSnapshot(forPath: staticValuesForData.instance.lname).value as! String)

                let contact = Contact(name: name , uid: user.key,
                                      pic: user.childSnapshot(forPath: staticValuesForData.instance.profileUrl).value as! String,
                                      userName: user.childSnapshot(forPath: staticValuesForData.instance.userName).value as! String )
                print(contact.name)
                print("user" , user)

                self.results.append(contact)

            }

        }
    }

}

}

表格视图扩展名:

extension SearchForUsersViewController : UITableViewDataSource , 
UITableViewDelegate {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isSearching{
        return results.count

    }
    return 0;
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell" , for: indexPath) as! AddedMeTableViewCell;
    cell.profilePicture.loadImageUsingCacheWithUrlString(urlString: filteredData[indexPath.item].picUrl)
    if isSearching{
    cell.userName.text = filteredData[indexPath.item].userName!
    }
    else
    {
          cell.userName.text = results[indexPath.item].userName!
    }
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 80;
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

}

}

搜索扩展程序(问题所在的位置)

extension SearchForUsersViewController : UISearchBarDelegate{

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == "" || searchBar.text == nil{
        view.endEditing(true)
        isSearching = false;
        tableView.reloadData()
    }
    else{
        isSearching = true
        ifSearchContains(word: searchBar.text!)
        tableView.reloadData()
        print(filteredData)
        print(results)
        print(searchBar.text)
    }
}

func ifSearchContains(word : String)
{
    for result in results{
        if result.name.contains(word){
            filteredData.append(result)
        }else{

        }
    }
}

}

我有上面的搜索功能,但它不是过滤,也不是非常有效的想法。这个应用程序将有成千上万的用户,你能帮助我以有效的方式过滤搜索吗?非常感谢你

以下是联系人自定义对象,以防万一

import Foundation

class Contact : NSObject , Comparable{

let name : String!
let uid : String!
let picUrl : String!
let userName : String!
init(name : String , uid : String , pic : String , userName : String) {
    self.name = name
    self.uid = uid
    self.picUrl = pic
    self.userName = userName
}

static func ==(lhs: Contact, rhs: Contact) -> Bool {
    return lhs.name == rhs.name
}

static func <(lhs: Contact, rhs: Contact) -> Bool {
    return lhs.name < rhs.name
}

}

0 个答案:

没有答案