通过NSInternalInconsistencyException声明"更新之前"价值错了

时间:2014-09-04 04:34:38

标签: ios uitableview core-data nsfetchedresultscontroller

我收到NSInternalInconsistencyException异常。它说:'无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(1)必须等于该部分中包含的行数。更新(1),加上或减去从该部分插入或删除的行数(插入1个,删除0个),加上或减去移入或移出该部分的行数(0移入,0移出)。

它说在更新numberOfRowsInSection之前是1,但在调试期间我看不到。在更新之前,上次调用numberOfRowsInSection时它返回0.

你有什么想法吗?

这就是我所看到的:

  1. numberOfRowsInSection返回0
  2. self.tableView.insertRowsAtIndexPaths([newIndexPath],withRowAnimation:.Fade)
  3. numberOfRowsInSection被调用并返回1
  4. 崩溃

1 个答案:

答案 0 :(得分:-1)

我的解决方案有两件事:(1)添加beginUpdates / endUpdates(2)添加一个bool变量来检查视图是否已经加载

更多解释:如果beginUpdates触发视图重新加载周期,那么viewcontroller将注意到数据源已经增加,因此没有insertRowsAtIndexPaths需要,如果beginUpdates没有触发视图重新加载周期则更新numberOfRowsInSection 1}}将被调用,因此可以调用insertRowsAtIndexPaths

func controller(controller: NSFetchedResultsController!, didChangeObject anObject: AnyObject!, atIndexPath indexPath: NSIndexPath!, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath!) {

        if controller == frc {

            switch(type) {
            case .Insert:

                isLayoutReloaded = false
                self.tableView.beginUpdates() //<- !!!
                if !isLayoutReloaded {        //<- !!!
                    self.tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)

                }
                self.tableView.endUpdates()   //<- !!!
            }
        }
    }

override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {

    isLayoutReloaded = true                   //<- !!!

    let numberOfRowsInSection = ((frc!.sections as NSArray)[0] as NSFetchedResultsSectionInfo).numberOfObjects
    return numberOfRowsInSection
}