Swift - “尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”

Posted

技术标签:

【中文标题】Swift - “尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”【英文标题】:Swift - "attempt to insert row 0 into section 0, but there are only 0 rows in section 0 after the update" 【发布时间】:2016-12-11 03:28:41 【问题描述】:

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

    


【问题讨论】:

1) 使用导致错误的实际代码更新您的问题,并指出导致错误的确切行。 2) 查找错误。已经讨论过很多次了。 【参考方案1】:

您的代码中有很多错误。其中任何一个都可能导致崩溃。

即使uid 无效,也会在表格视图中插入一行。 details 附加到数据源数组,但插入在表视图的索引 0 处 不要同时调用reloadData()insertRowsAtIndexPaths。删除reloadData()

【讨论】:

【参考方案2】:

对于遇到此问题的其他用户,在尝试更新未分配 dataSource 的 TableView 或 CollectionView 时也会出现这些错误。确保 TableView 的 dataSource 已连接(使用情节提要或 nib 时)或以编程方式分配。

【讨论】:

以上是关于Swift - “尝试将第 0 行插入第 0 节,但更新后第 0 节中只有 0 行”的主要内容,如果未能解决你的问题,请参考以下文章

Swift 反射

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift