Swift - "попытка вставить строку 0 в раздел 0, но в разделе 0 после обновления осталось только 0 строк"

Xcode 8.1, Swift 2.3, iOS 10.1, и я использую Firebase

Я зарегистрировал уведомления, используя FireBase. И я пытаюсь показать уведомления на uitableview. viewDidLoad() успешно соединяет firebase и получает значение. Но я не могу перечислить входящие данные.

Сначала я получил сообщение об ошибке "cellForRowAtIndexPath не работает". После я использую forRow & inSection. Но сейчас я получаю ошибку, что я не знаю, что это значит.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to insert row 0 into section 0, but there are only 0 rows in section 0 after the update'

NoticeViewController.swift

import UIKit
import FirebaseDatabase
import FirebaseAuth
import FirebaseStorage

private let reuseIdentifier = "NoticeViewTable"

class NoticeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var aivLoading: UIActivityIndicatorView!
    @IBOutlet weak var noticeTableView: UITableView!

    var databaseRef = FIRDatabase.database().reference()
    var usersDict = NSDictionary()

    var noticesArray = [AnyObject]()
    var loggedInUser : AnyObject?



    @IBAction func didTapAddNotice(sender: AnyObject) {

        let mainStorboard: UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

        let viewController: UIViewController = mainStorboard.instantiateViewControllerWithIdentifier("AddNoticeView")
        self.presentViewController(viewController, animated: true, completion: nil)

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        self.loggedInUser = FIRAuth.auth()?.currentUser

        self.aivLoading.startAnimating()
        self.databaseRef.child("notice").observeEventType(.Value, withBlock: { (snapshot) in

            self.usersDict = snapshot.value as! NSDictionary

            self.noticesArray = [AnyObject]()

            for (userId, details) in self.usersDict {

                let noticeImg = details.objectForKey("noticeImage1") as! String
                let profileImg = details.objectForKey("profileImage") as! String
                let profileName =  details.objectForKey("userName") as! String
                let wage = details.objectForKey("wage") as! String
                let noticeName = details.objectForKey("noticeName") as! String

                if(self.loggedInUser?.uid != userId as? String){
                    details.setValue(userId, forKey: "uId")
                    self.noticesArray.append(details)
                }

                self.noticeTableView?.reloadData()

                self.noticeTableView.insertRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: UITableViewRowAnimation.Automatic)

                self.aivLoading.stopAnimating()


            }

        }) {(error) in
            print(error.localizedDescription)
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

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

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.noticesArray.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {

        let cell: NoticeViewTableViewCell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! NoticeViewTableViewCell

        let profileImageURL = NSURL(string: self.noticesArray[indexPath.row]["profileImage"] as! String)
        let profileImageData = NSData(contentsOfURL: profileImageURL!)
        cell.profilePic.image = UIImage(data:profileImageData!)

        let noticeImageURL = NSURL(string: self.noticesArray[indexPath.row]["noticeImage!"] as! String)
        let noticeImageData = NSData(contentsOfURL: noticeImageURL!)
        cell.noticeImage.image = UIImage(data:noticeImageData!)


        //add a border and corner radius the images
        cell.profilePic.layer.masksToBounds = true
        cell.profilePic.layer.cornerRadius = cell.profilePic.frame.size.width/2.0
        cell.profilePic.layer.borderWidth = 1.5


        let profileName = (self.noticesArray[indexPath.row]["userName"] as? String)!
        cell.userName.text = profileName

        let noticeName = (self.noticesArray[indexPath.row]["noticeName"] as? String)!
        cell.noticeName.text = noticeName

        let wage = (self.noticesArray[indexPath.row]["wage"] as? String)!
        cell.wage.text = wage

        return cell

    }

}

2 ответа

Решение

В вашем коде много ошибок. Любой из них может вызвать аварию.

  • Строка вставляется в табличное представление, даже если uid не является действительным.
  • details добавляется в массив источника данных, но вставляется с индексом 0 в табличном представлении
  • Не звоните обоим reloadData() а также insertRowsAtIndexPaths, удалять reloadData()

Для других пользователей, которые сталкиваются с этим вопросом, эти ошибки также возникают при попытке обновить TableView или CollectionView без назначенных. Убедитесь, что TableView dataSource подключается (при использовании раскадровки или пера) или назначается программно.

Другие вопросы по тегам