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
此外,在 itemDetailViewController
和 numberOfRowsInSection
函数中放置一个断点以检查模型值。
您确定您的 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视图。
我有一个 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
此外,在 itemDetailViewController
和 numberOfRowsInSection
函数中放置一个断点以检查模型值。
您确定您的 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视图。