0

I have a UITableViewController showing all my users from Firebase in a list. If you tap on one user you see another UITableViewController with a static TableView Layout prepared in the Interface Builder to edit the user properties. I want to pass the UID of the selected user to the DetailTableViewController to load all of the current user data there.

EDIT: This question is not an exact duplicate. I want to pass data from one UITableViewController to another UITableViewController not a normal Detail UIViewController!

This is my current code of the first TableViewController.

Can somebody help me? I don't get it.

UserListTableViewController.swift:

import UIKit
import Firebase
import FirebaseAuth
import FirebaseDatabase

class UserListTableViewController: UITableViewController {

    var dbRef:FIRDatabaseReference!
    var user = [User]()

    var writeSelectedUID:String!
    var selectedUID: String = "Mister X"

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.startObservingDB()
    }

    func startObservingDB () {
        dbRef.observe(.value, with: { (snapshot:FIRDataSnapshot) in
            var newUser = [User]()

            for user in snapshot.children {
                let userObject = User(snapshot: user as! FIRDataSnapshot)
                newUser.append(userObject)
            }
            self.user = newUser
            self.tableView.reloadData()
        }) { (error:Error) in
            print(error.localizedDescription)
        }
    }

    // MARK: - Table view data source
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return user.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "User Cell", for: indexPath) as! CustomUserListTableViewCell

        // Configure the cell
        let userRow = user[indexPath.row]
        cell.userFirstLastNameLabel?.text = "\(userRow.firstName!) \(userRow.lastName!)"
        cell.userUsernameLabel?.text = "@\(userRow.username!)"
        }
        return cell   
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //let selectedUID = user[indexPath.row]
        let selectedUserRow = user[indexPath.row]
        self.writeSelectedUID = "\(selectedUserRow)"
        performSegue(withIdentifier: "editUser", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        let viewcontroller = segue.destination as! ManageUserSettingsTableViewController
        // Pass the selected object to the new view controller.

        if(segue.identifier == "editUser") {
            viewcontroller.usernameTextField.text! = "\(self.writeSelectedUID)"
            print("Var: \(self.writeSelectedUID)")
        }
    }
}
mcd
  • 706
  • 4
  • 25

1 Answers1

1

In UserListTableViewController.swift :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    let viewcontroller = segue.destination as! ManageUserSettingsTableViewController
    // Pass the selected object to the new view controller.

    //let object = self.writeSelectedUID as? String
    // let object = self.writeSelectedUID as! String!

    if(segue.identifier == "editUser") {
             if let object = self.writeSelectedUID {
                   viewcontroller.detailItem = object as AnyObject?
             }
    }
}

In your AnotherViewController :

var detailItem: AnyObject?

usernameTextField.text = detailItem?.description
helio
  • 21
  • 5
  • Your version gave me the same error I had: 'fatal error: unexpectedly found nil while unwrapping an Optional' I added a working solution – mcd Dec 29 '16 at 17:26