【问题标题】:xCode/Firebase Search bar cell failxCode/Firebase 搜索栏单元失败
【发布时间】:2017-10-23 12:17:56
【问题描述】:

我现在已经尝试了所有方法(据我所知),我什至从头开始制作了整个东西,但它仍然无法正常工作。

我制作了一个搜索栏,可以在 firebase 中搜索数据并将其显示在 tableview 中。如果用户点击搜索栏中的个人资料,则会显示一个新的视图控制器,其中包含有关该用户的信息。

问题在于,如果您开始搜索,然后单击配置文件,它会显示在搜索发生之前在 tableview 中的该位置开始的配置文件。 这是我在没有搜索的情况下看到的,它在 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.
    )}

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

【问题讨论】:

    标签: ios swift uitableview firebase-realtime-database


    【解决方案1】:

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

    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])。

    【讨论】:

    • 在 var user: User 中,显示未声明的类型“User”
    【解决方案2】:

    如果我正确理解了您的代码,那么您的问题就在这里:

    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
        }
    }
    
    let user = usersArray[indexPath.row] // this is wrong
    

    由于您在搜索栏处于活动状态时过滤了结果,因此您必须使用更新后的数据源

    let user = filteredUsers[indexPath.row]
    

    基本上,您在继续之前传递了错误的信息。

    【讨论】:

    • 它说指令不好?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多