从FireTable数据库将数据从UITableviewCell传递到下一个ViewController不显示

时间:2019-04-19 16:58:03

标签: swift firebase uitableview uiviewcontroller

我已经搜索了一些有关此问题的答案,但在我的情况下似乎没有一个适用/可行的,这就是为什么我决定问社区的原因。我只是试图将数据从表视图单元格传递到下一个视图控制器。我已经尽力能够在单元格中准确显示信息,但是每当我选择该行时,它只会显示没有信息的视图控制器

我试图将标签和图片设置为UITableViewCell可能显示的任何内容,但是它不起作用。我创建了一个NSObject类,该类定义了变量,这就是为什么它使我无法将数据传递给下一个视图控制器的原因。

这是我的AddFriendViewController,我在其中从Firebase获取用户,并在表格视图中显示我的信息

df_new[['Student']]

   Student
0     Eric
1    Caden
4    Laura
5    Leann
7     Jack
8     Jill
10  Andrew
15   Sarah
16    Brit

这是我的用户类别:

class AddFriendViewController: UIViewController {

var users = [Users]()


var databaseRef = Database.database().reference()


@IBOutlet weak var friendsTableView: UITableView!
override func viewDidLoad() {
    super.viewDidLoad()

    friendsTableView.delegate = self
    friendsTableView.dataSource = self

    fetchUser()

}

func fetchUser() {
    databaseRef.child("users").observe(.childAdded) { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let user = Users()
            user.nameOfUser = dictionary["nameOfUser"] as? String ?? ""
            user.email = dictionary["email"] as? String ?? ""
            user.profileImageURL = dictionary["profileImageURL"] as? String ?? ""

            self.users.append(user)

            DispatchQueue.main.async {
                self.friendsTableView.reloadData()
            }
        }
    }

 }


}

extension AddFriendViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return self.users.count
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let friendCell = UITableViewCell(style: .subtitle, reuseIdentifier: "friendCell")


    let user = users[indexPath.row]
    friendCell.textLabel?.text = user.nameOfUser
    friendCell.detailTextLabel?.text = user.email


    if let profileImageURL = user.profileImageURL {
        let url = URL(string: profileImageURL)
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            if error != nil {
                print(error)
                return
            }
            DispatchQueue.main.async {

                friendCell.imageView?.image = UIImage(data: data!)

              }

            }.resume()
    }

    return friendCell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    performSegue(withIdentifier: "showFriendProfile", sender: self.users[indexPath.row])
    self.friendsTableView.deselectRow(at: indexPath as IndexPath, animated: true)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showFriendProfile" {
        if let indexPath = friendsTableView.indexPathForSelectedRow {
            let dvc = segue.destination as! DetailViewController

            ***This is where I am confused as to what I should be doing***
            //EDIT1: 
            print("The nameOfUser is \(user.nameOfUser!)")
            print("The email is \(user.email!)")

        }
    }
  }

}

这是我的DetailViewController:

class Users: NSDictionary {
    var nameOfUser: String?
    var email: String?
    var profileImageURL: String?

}

显而易见的目标是简单地单击单元格以在下一个视图控制器上显示数据。我知道过去曾问过类似的问题,但我真的不知道如何使用这些问题来解决我的问题。任何帮助将不胜感激,请让我知道是否需要澄清。

EDIT1: 我在prepare for segue函数上添加了print语句,并注意到它至少是在提取信息,但由于某种原因未将其传递给下一个视图控制器。

谢谢

2 个答案:

答案 0 :(得分:0)

您只需要获取发送者并设置详细信息视图控制器的属性。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showFriendProfile" {
        guard let dvc = segue.destination as? DetailViewController else {
            return
        }

        if let user = sender as? Users {
            DispatchQueue.main.async {
                dvc.nameOfUserLabel.text = user.nameOfUser
                dvc.emailLabel.text = user.email
                let url = URL(string: user.profileImageURL!)
                let data = try? Data(contentsOf: url!)
                dvc.profileImageView.image = UIImage(data: data!)
            }
        }
    }
}

答案 1 :(得分:0)

1-发送对象(确保将segue源连接到vc本身而不是单元)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if segue.identifier == "showFriendProfile" {
     if let indexPath = friendsTableView.indexPathForSelectedRow {
         let dvc = segue.destination as! DetailViewController
         dvc.user = sender as! Users
      }
   }
} 

class DetailViewController: UIViewController {
   var user:Users! // add this then inside viewDidLoad set the labels 
}

2-不要在URLSession.shared.dataTask(with: url!) { (data, response, error)中使用cellForRowAt来考虑使用SDWebImage

import SDWebImage // install pods then add this line top of the vc

friendCell.imageView?.sd_setImage(with: URL(string:urlStr), placeholderImage: UIImage(named: "placeholder.png"))

3-不需要DispatchQueue.main.async {

DispatchQueue.main.async {
   self.friendsTableView.reloadData()
}

默认情况下,firebase回调在主线程中运行