如何将Firebase iOS中的数据从TableViewController传递到另一个ViewController

时间:2017-10-17 16:24:11

标签: ios firebase swift3 firebase-realtime-database tableview

当我在搜索栏中搜索期间通过从Firebase数据库检索昵称来尝试查找用户时,我正在开发应用。我将所有用户的昵称放在一个数组中,并在tapped文本与自动填充的用户昵称匹配时在tableView中显示。我能够做到。 但是现在我尝试显示用户个人资料页面,如果我搜索用户,我在表格视图中选择名称,然后在tableView上点击他的昵称,然后打开另一个ViewController,并显示所选用户的信息但它只是显示默认页面,没有任何关于所选用户的自定义信息。

我告诉你我现在的代码:

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

我该怎么做?

1 个答案:

答案 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
}
}

希望它可以帮助别人。 现在,我试图在同一页面中显示他的用户个人资料图片。