NSInvalidArgumentException,原因:索引处的索引中没有对象。 UICollectionViewController和NSFetchedResultsController

时间:2017-01-13 06:21:31

标签: ios swift core-data

尝试添加按钮"添加新"在UICollecitonView的最后。 使用CoreData

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionCell
    configureCell(cell: cell, indexPath: indexPath)

    var numberOfItems = self.collectionView(self.collectionView, numberOfItemsInSection: 0)

    if (indexPath.row == numberOfItems - 1) {            
        var addCellButton = UIButton(frame: cell.frame)
        addCellButton.setTitle("Add", for: UIControlState.normal)

        cell.addSubview(addCellButton)
    }
    return cell
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if let sections = controller.sections {
        let sectionInfo = sections[section]
        return sectionInfo.numberOfObjects + 1
    }
    return 0
}
  

错误:' NSInvalidArgumentException',原因:'索引0处的索引3处没有对象'

我是否需要检查NSFetchedResultsController的界限? 正如这里提出的那样:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'no object at index 3 in section at index 0'

1 个答案:

答案 0 :(得分:0)

您告诉UICollectionView该部分中您有一个额外项目,而不是NSFetchedResultsController中存储的项目。

我相信当您尝试从NSFetchedResultsController.object(at: IndexPath)方法访问configureCell时,您会说那个“额外”项目会引发异常。

如果您希望“添加新”按钮与其他所有按钮显示在同一类型的单元格中,则应停止在collectionView(numberOfItemsInSection:)

中添加额外项目

或者,您可以创建一个不同类型的单元格放在最后,只需添加“添加”按钮,然后在单元格出列之前移动if语句。如果您正在填充最后一项,则使用该按钮将“AddNew”单元标识符出列。否则,您将“Cell”标识符出列,并将其配置为显示NSFetchedResultsController

中的数据