2017-10-17 4 views
0

検索バーで検索中に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 
     } 
    }) 
} 
} 

はどのように私はそれを行うことができますか?

+0

デバッグ結果は何ですか?コールバック内にブレークポイントを配置すると、firebaseからデータを印刷できますか? –

+0

問題を解決して、ここに解決策を投稿できます –

答えて

0

私はこの問題を自分で解決しました。他人を助けることができれば、コードを投稿します。

私はあなたに私の現在のコード(最初のビューコントローラがUserTableViewControllerである)を示しています。

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! 

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() 
} 

// I change the content of this function 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "userProfil" { 
     let userViewController = segue.destination as! UserViewController 
     userViewController.pseudo = self.name! // "name" is a String variable declared at the beginning, "pseudo" is a variable declared in the UserViewController 
    } 
} 

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 
} 

// This function is the most important because after search a user in search bar, it display it in table view cell then you choose it so you go the UserViewController where you can see the username write on this user profile page, you got to write the performSegue at the end of this function if not it can't work because if you put the performSegue at the beginning it won't find the right username because the prepare for segue function will call before and we don't want our "name" variable is nil 
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let post = filteredUsers[indexPath.row] as! String 
    self.name = post 
    print("name : \(name!)") // You can see in the console the name of the user you choose 
    performSegue(withIdentifier: "userProfil", sender: nil) 
} 
} 

そして、他のビューコントローラ(UserViewController)のために:

class UserViewController: UIViewController { 
@IBOutlet weak var name: UILabel! 
var pseudo = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    name.text = pseudo // Here name is a Label, so I put the "pseudo" variable for display it in the "name" Label and it can show the right nickname of user you choose in the search bar 
} 
} 

は、それが他の誰かを助けることができると思います。 これで、同じページにユーザープロフィールの画像を表示しようとしています。

関連する問題