Je suis en train de développer une application lorsque j'essaie de trouver des utilisateurs en les récupérant dans la base de données Firebase lors d'une recherche dans une barre de recherche. Je mets tous les pseudonymes de mes utilisateurs dans un tableau et les affiche dans tableView lorsque le texte tapé correspond aux surnoms des utilisateurs avec l'auto-complétion. Je suis capable de le faire. Mais maintenant j'essaye d'afficher la page de profil d'utilisateur si je recherche un utilisateur, je choisis est nom dans la vue de table puis tape son surnom sur le tableView alors il ouvre un autre ViewController et devrait afficher les informations de l'utilisateur choisi mais il montre juste la page par défaut sans aucune information personnalisée sur l'utilisateur sélectionné.Comment transmettre des données de Firebase iOS d'un TableViewController à un autre ViewController
je vous montre mon code actuel:
class UserTableViewController: UITableViewController, UISearchResultsUpdating {
var userTab = [String]()
var userEmpty = ["No user"]
var filteredUsers = [String]()
var searchController: UISearchController!
var resultsController = UITableViewController()
var name: String!
var ref: DatabaseReference!
var dictDetails: [String:AnyObject]?
override func viewDidLoad() {
super.viewDidLoad()
self.resultsController.tableView.dataSource = self
self.resultsController.tableView.delegate = self
ref = Database.database().reference()
ref.child("users").queryOrdered(byChild: "pseudo").observeSingleEvent(of: .value, with: { (snapshot) in
self.userTab = []
if (snapshot.value is NSNull) {
print("No data found")
} else {
for child in snapshot.children {
let userSnap = child as! DataSnapshot
let uid = userSnap.key
let userDict = userSnap.value as! [String: AnyObject]
let pseudo = userDict["pseudo"] as! String
let total = snapshot.childrenCount
self.userTab.append(pseudo)
self.resultsController.tableView.reloadData()
continue
}
}
})
self.searchController = UISearchController(searchResultsController: self.resultsController)
self.tableView.tableHeaderView = self.searchController.searchBar
self.searchController.searchResultsUpdater = self
self.searchController.dimsBackgroundDuringPresentation = false
self.definesPresentationContext = true
}
func updateSearchResults(for searchController: UISearchController) {
self.filteredUsers = self.userTab.filter { (user:String) -> Bool in
if user.lowercased().contains(self.searchController.searchBar.text!.lowercased()) {
return true
} else {
return false
}
}
self.resultsController.tableView.reloadData()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "userProfil" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let data = userTab[indexPath.row] as! [String: AnyObject]
let pseudo = data["pseudo"] as? String
let controller = segue.destination as! UserViewController
controller.pseudo = pseudo!
}
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == self.tableView {
return self.userTab.count
} else {
return self.filteredUsers.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
if tableView == self.tableView {
cell.textLabel?.text = self.userTab[indexPath.row]
} else {
cell.textLabel?.text = self.filteredUsers[indexPath.row]
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "userProfil", sender: nil)
}
}
Et pour l'autre contrôleur de vue:
class UserViewController: UIViewController {
@IBOutlet weak var name: UILabel!
var pseudo: String = ""
var dictionary: [String:AnyObject]?
var ref: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
ref = Database.database().reference()
ref.child("users").queryOrdered(byChild: pseudo).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
self.name.text = dictionary["pseudo"] as? String
}
})
}
}
Comment puis-je faire cela?
Que déballez-vous les résultats? lorsque vous placez le point d'arrêt à l'intérieur du rappel, vous pouvez imprimer des données à partir de Firebase? –
Ok, je résous mon problème, je peux poster la solution ici –