2014-09-04 89 views
0

我得到一个NSInternalInconsistencyException异常。它说:'更新无效:部分0中的行数无效。更新(1)后现有部分中包含的行数必须等于更新(1)之前该部分中包含的行数,加上或减去从该部分插入或删除的行数(插入1个,删除0个),加上或减去移入或移出该部分的行数(0移入,0移出)。由NSInternalInconsistencyException声明“更新前”值错误

它说更新之前numberOfRowsInSection是1,但它不是我在调试过程中可以看到的。在更新之前,上次调用numberOfRowsInSection时返回0.

您有什么想法吗?

这是我所看到的:

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

错误是说,有更新前1行,更新后它应该是2,但它不是2 – bhargavg 2014-09-04 04:40:34

回答

-1

我的解决方案有两点:(1)加beginUpdates/endUpdates(2)添加一个布尔变量来检查视图是否已加载或不

更多的解释:如果beginUpdates触发视图重装周期则视图 - 控制会注意到,数据源已经增加,所以没有insertRowsAtIndexPaths需要,如果beginUpdates不触发视图重装周期则neigter numberOfRowsInSection将被调用,所以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 
}