UISegmentController 与 UITableviewController

UISegmentController with UITableviewController

我有一个 table 视图,它有一个分段控制器,它分别有两个分段类别 1 和 2。当我将一个项目添加到类别 1 时,它完美地完成了,但是当我将一个项目添加到类别 2 时,它使应用程序崩溃,提示“由于未捕获的异常 'NSInternalInconsistencyException',正在终止应用程序”,原因:'attempt to insert row 0 into section 0, but there are only 0 rows in section 0 after the update'。 这是我插入 table 视图的代码。

对于类别 1:

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: NoToDoItem) {
    let newRowIndex = items.count

    items.append(item)

    let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
    let indexPaths = [indexPath]
    tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

    dismissViewControllerAnimated(true, completion: nil)
}

对于类别 2:

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingNotSureItem notSureItem: NotSureItem) {
    let newRowIndex = notSureItems.count

    notSureItems.append(notSureItem)

    let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
    let indexPaths = [indexPath]
    tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

    dismissViewControllerAnimated(true, completion: nil)
}

UITable视图必须始终与数据源保持同步。如果数据源可以在后台线程中更改,则必须特别小心。

在数据源中添加内容时,请尽快调用beginUpdate/insert/endUpdate。所以试试这个:

tableView.beginUpdates()

let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
let indexPaths = [indexPath]
tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)

tableView.endUpdates()

PS:信任您的数据源模型对象 notSureItems 设置正确并且 numberOfRowsInSection 函数 returns 正确计数。

编辑: Post OP 评论

您正试图在错误的索引处添加行。 Table 视图索引以 0 开头,因此您应该如何推断新的单元格索引:

notSureItems.append(notSureItem)
let newRowIndex = notSureItems.count - 1

此外,在 itemDetailViewControllernumberOfRowsInSection 函数中放置一个断点以检查模型值。

您确定您的 table 显示的是您当前添加的同一类别吗?试试这个:

func itemDetailViewController(controller: ItemDetailViewController, didFinishAddingItem item: NoToDoItem) {
    let newRowIndex = items.count

    items.append(item)
    if segmentBar.selectedSegmentIndex == 0 {
        let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
        let indexPaths = [indexPath]
        tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
    }
    dismissViewControllerAnimated(true, completion: nil)
}

并对 didFinishAddingNotSureItem 执行相同的操作。

还要确保在更改类别时重新加载table视图。