Передача данных из базы данных Firebase из UITableviewCell в следующий ViewController не отображается - PullRequest
0 голосов
/ 19 апреля 2019

Я уже искал некоторые ответы, которые были заданы по этому поводу, но ни один из них, похоже, не подходит / не работает в моей ситуации, поэтому я решил спросить сообщество.Я просто пытаюсь передать данные из ячейки табличного представления в следующий контроллер представления.Я дошел до возможности точного отображения информации в моих ячейках, однако, когда я выбираю строку, он просто показывает контроллер представления без информации

Я пытался установить метки и изображения на любой UITableViewCellможет показывать но это не работает.Я создал класс NSObject, который определяет переменные, поэтому меня смущает вопрос о том, как передавать данные в контроллер следующего представления.

Это мой AddFriendViewController, где я выбираю пользователей из Firebase, и он отображаетмоя информация о табличном виде

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!)")

        }
    }
  }

}

Это мой класс пользователей:

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

}

Это мой DetailViewController:

class DetailViewController: UIViewController {

var nameOfUser = String()
var email = String()
var profileImageURL = UIImage()

var ref: DatabaseReference?


@IBOutlet weak var profileImageView: UIImageView!

@IBOutlet weak var nameOfUserLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    nameOfUser = nameOfUserLabel.text!
    email = emailLabel.text!
    profileImageURL = profileImageView.image!

    }

}

Очевидная цель - просто нажатьв ячейке, чтобы показать данные на следующем контроллере представления.Я понимаю, что подобные вопросы задавались в прошлом, но я действительно не знаю, как использовать их в качестве решения моей проблемы.Буду очень признателен за любую помощь, и, пожалуйста, дайте мне знать, если есть что-то, что мне нужно уточнить.

РЕДАКТИРОВАТЬ1: Я добавил оператор печати в функцию подготовки к переходу и заметил, что это по крайней мере извлекает информацию, но дляпо какой-то причине не передать его следующему контроллеру представления.

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

1- Отправьте объект (убедитесь, что источник segue подключен к самому виртуальному каналу, а не к ячейке)

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 по умолчанию выполняются в главном потоке

0 голосов
/ 19 апреля 2019

Вам просто нужно получить отправителя и установить свойства контроллера подробного представления.

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!)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...