検索バーで検索中にFirebaseデータベースからニックネームを取得してユーザーを検索しようとしているときに、アプリケーションを開発しています。私はすべてのユーザのニックネームを配列に入れ、タップしたテキストがユーザのニックネームとオートコンプリートを一致させるとtableViewに表示します。私はそれをすることができます。 しかし、私はユーザーを検索する場合、私は選択したテーブルビューで名前を選択し、次に、別のViewControllerを開き、選択したユーザーの情報を表示する必要がありますtableviewでニックネームをタップ選択したユーザーに関するカスタム情報がない既定のページが表示されます。TableViewControllerから別のViewControllerにFirebase iOSのデータを渡す方法
私はあなたに私の現在のコードを示しています。
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)
}
}
そして、他のビューコントローラのために:
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
}
})
}
}
はどのように私はそれを行うことができますか?
デバッグ結果は何ですか?コールバック内にブレークポイントを配置すると、firebaseからデータを印刷できますか? –
問題を解決して、ここに解決策を投稿できます –