Проблема с: не удалось получить ячейку из своего источника данных

#ios #swift #firebase #tableview #firebase-realtime-database

#iOS #swift #firebase #просмотр таблицы #firebase-realtime-database

Вопрос:

Прикрепленный скриншот проблемы при попытке отображения в виде таблицы. Я продолжаю получать сообщение об ошибке:

Не удалось получить ячейку из списка классов источника данных: UITableViewController {

   var users = [user]()


override func viewDidLoad() {
       let databaseRef = FIRDatabase.database().reference()
   databaseRef.child("Users").queryOrderedByKey().observe(.childAdded, with: {
   snapshot in
   print(snapshot)


    let addNote = (snapshot.value as? NSDictionary)?["addNote"] as? String ?? ""
    let uid = (snapshot.value as? NSDictionary)?["uid"] as? String ?? ""
       self.users.append(user(addNote: addNote,uid: uid))
        self.tableView.reloadData()
          print(self.users)
 })

    }

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       print("Test(users.count)")
       return users.count
        }


 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
    let nameLbl = cell?.viewWithTag(2) as! UILabel
    nameLbl.text = self.users[indexPath.row].addNote
    return cell!

   }
  

Комментарии:

1. Где вы создаете cell ? Ваш код как есть даже не будет компилироваться

2. Я пытался получить из firebase .. используя swift3 Xcode 8… но когда я запускаю этот код с пользовательской ячейкой, он выдает ту же ошибку

3. Вы не можете запустить опубликованный вами код, он даже не будет компилироваться. Скопируйте и вставьте ваш фактический cellForRowAtIndexPath метод.

4. Кстати, если вы новичок в iOS и Swift, вы должны использовать Xcode 8 и Swift 3.

5. Пожалуйста, проверьте скриншот, который я прикрепил по предоставленной ссылке

Ответ №1:

вам придется удалить tableviewcells

    func tableView(_ tableView: UITableView, cellForRowAt indexPath:          IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier, for: indexPath) as! UITableViewCell
  return cell
}
  

Ответ №2:

ok…as насколько я понимаю, у вас есть отдельный файл .xib для вашей tableViewCell, а не прототип ячейки, поскольку вы пытаетесь зарегистрировать свой nib в tableview перед его использованием. Итак, чтобы это произошло правильно, вам необходимо обеспечить несколько вещей:

  1. Вы указали идентификатор для своей ячейки TableView в файле .xib.
  2. Вы используете этот идентификатор для регистрации этой ячейки, например.

    пусть nib = UINib(nibName: «MyTableViewCell», bundle: nil)
    self.TableView.registerNib(nib, forCellReuseIdentifier: «abc»)

Здесь «abc» является идентификатором.

  1. Затем в делегате cellForRowAtIndexPath,

    пусть cell = TableView.dequeueReusableCellWithIdentifier(«abc», forIndexPath: indexPath) как! MyTableViewCell

Я думаю, вам следует использовать описанные выше шаги, чтобы зарегистрировать перо, а затем удалить его. Все должно работать нормально.

Комментарии:

1. Посмотрите на код в вопросе. Операционная система уже вызывается register .

2. В коде ни одна конкретная ячейка не регистрируется и не удаляется … и даже если вы не хотите удалять (по какой-либо причине), по крайней мере, вам нужно создать экземпляр класса cell, чтобы выполнять функции, которые выполняются в cellForRow…..

3. спасибо за ваш ответ, Мэдди. Пожалуйста, проверьте скриншот, который я прикрепил по предоставленной ссылке