ios - xCode/Firebase 搜索栏单元格失败

标签 ios swift uitableview firebase-realtime-database

我现在已经尝试了一切(据我所知),我什至从头开始制作了整个东西,但它仍然不起作用。

我制作了一个搜索栏,可以在 firebase 中搜索数据并将它们显示在表格 View 中。如果用户单击搜索栏中的个人资料,则会显示一个新的 View Controller ,其中包含有关该用户的信息。

问题是,如果您开始搜索,然后单击配置文件,它会在搜索发生之前在表格 View 中显示从该位置开始的配置文件。 这是我在没有搜索的情况下看到的,它在 firebase 中显示了 2 个正确的配置文件:

现在,当我搜索个人资料“Lars Larsen”时,它会按应有的方式进行过滤:

但是,如果我现在通过单击“Lars Larsen”来选择个人资料,它会显示“Jonas Larsen”的个人资料,它在搜索之前位于顶部?

这是我的 searchViewController 的代码:

import UIKit
import FirebaseDatabase

class SearchTableViewController: UITableViewController, 
UISearchResultsUpdating {

let searchController = UISearchController(searchResultsController: nil)

@IBOutlet var findKunder: UITableView!

var loggedInUser: user?
var usersArray = [NSDictionary?]()
var filteredUsers = [NSDictionary?]()

var databaseRef = Database.database().reference()

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    databaseRef.child("Buyers").queryOrdered(byChild: "Personnr").observe(.childAdded, with: { (snapshot) in

        let key = snapshot.key
        let snapshot = snapshot.value as? NSDictionary
        snapshot?.setValue(key, forKey: "Personnr")

        self.usersArray.append(snapshot)

        //Insert rows

        self.findKunder.insertRows(at: [IndexPath(row:self.usersArray.count-1,section:0)], with: UITableViewRowAnimation.automatic)

    }) { (error) in
        print(error)
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    if searchController.isActive && searchController.searchBar.text != ""{
        return filteredUsers.count
    }
    return self.usersArray.count
}


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

    let user : NSDictionary?

    if searchController.isActive && searchController.searchBar.text != ""{
        user = filteredUsers[indexPath.row]
    }
    else
    {
        user = self.usersArray[indexPath.row]
    }

    cell.textLabel?.text = user? ["Navn"] as? String
    cell.detailTextLabel?.text = user?["Telefonnr"] as? String

    // Configure the cell...

    return cell
}

func updateSearchResults(for searchController: UISearchController) {

    filterContent(searchText: self.searchController.searchBar.text!)
}

func filterContent(searchText:String)
{
    self.filteredUsers = self.usersArray.filter{ user in
        var fNavn = false
        var personNr = false
        var searchBil = false
        var telefonNr = false
        var korekortNr = false


        if let Navn = user!["Navn"] as? String {
            fNavn =  Navn.lowercased().contains(searchText.lowercased())
        }
        if let Bil = user!["Bil"] as? String {
            searchBil = Bil.lowercased().contains(searchText.lowercased())
        }
        if let Personnr = user!["Personnr"] as? String {
            personNr = Personnr.lowercased().contains(searchText.lowercased())
        }
        if let Kørekortnr = user!["Kørekortnr"] as? String {
            korekortNr = Kørekortnr.lowercased().contains(searchText.lowercased())
        }
        if let Telefonnr = user!["Telefonnr"] as? String {
            telefonNr = Telefonnr.lowercased().contains(searchText.lowercased())
        }



        return fNavn || personNr || searchBil || korekortNr || telefonNr



    }

    tableView.reloadData()

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    let showUserProfileViewController = segue.destination as! userProfileViewController

    showUserProfileViewController.loggedInUser = self.loggedInUser

    if let indexPath = tableView.indexPathForSelectedRow {
        let user = usersArray[indexPath.row]
        showUserProfileViewController.otherUser = user
    }
}


}

这是我用来显示配置文件的代码:

import UIKit
import Firebase

class ProfileViewController: UIViewController {



//Outlets
var loggedInUser:User?
var otherUser:NSDictionary?
var databaseRef:DatabaseReference!
var loggedInUserData: NSDictionary?
@IBOutlet weak var Biler: UILabel!
@IBOutlet weak var Navn: UILabel!
@IBOutlet weak var kundeInfo: UILabel!
@IBOutlet weak var bilInfo: UILabel!
@IBOutlet weak var telefonNr: UILabel!
@IBOutlet weak var korekortNr: UILabel!
@IBOutlet weak var personNr: UILabel!
@IBOutlet weak var Interesse: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    self.databaseRef = Database.database().reference()

    databaseRef.child("Buyers").child(self.otherUser?["Personnr"] as! String).observe(.value, with: { (snapshot) in

        let uid = self.otherUser?["Personnr"] as! String
        self.otherUser = snapshot.value as? NSDictionary
        self.otherUser?.setValue(uid, forKey: "Personnr")


    self.Navn.text = self.otherUser?["Navn"] as? String
    self.bilInfo.text = self.otherUser?["Bil"] as? String
    self.telefonNr.text = self.otherUser?["Telefonnr"] as? String
    self.Interesse.text = self.otherUser?["Interesse"] as? String
    self.personNr.text = self.otherUser?["Personnr"] as? String
    self.korekortNr.text = self.otherUser?["Kørekortnr"] as? String

    }
    // Do any additional setup after loading the view.
    )}

如果您需要任何其他信息,请告诉我。我希望你能帮上忙。

最佳答案

如果搜索栏处于事件状态并且确实包含文本,您应该将用户从 filteredUsers 数组而不是 usersArray 传递给 ProfileViewController .

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    [...]

    if let indexPath = tableView.indexPathForSelectedRow {
        if searchController.isActive && searchController.searchBar.text != "" {
            showUserProfileViewController.otherUser = filteredUsers[indexPath.row]
        } else {
            showUserProfileViewController.otherUser = usersArray[indexPath.row]
        }
    }        
}

附带说明一下,您不应该在 Swift 中使用 NSDictionary。请改用 Swift 的 Dictionary(对于您的情况,如果是 [String: Any])。

关于ios - xCode/Firebase 搜索栏单元格失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889179/

相关文章:

ios - NSNumberFormatter 等价于 stringWithFormat

arrays - 数组元素作为函数中的参数

ios - 如何在 Swift WatchKit 中捕获表格行的按下操作?

ios - 将参数从 sudzC ios 传递给 java webservice 始终为 null

ios - 应用程序如何将存储的通知显示为本地化字符串?

swift - 如何创建像 viewDidLoad 这样的覆盖函数?

uitableview - iOS Swift - 使用搜索栏和搜索显示过滤具有自定义单元格的 UITableView 的内容

ios - 更改详细信息 UILabel 的宽度 - iOS

ios - TableView 的渐变

ios - 核心数据Fetch请求语法查询