我有两个表,我在它们之间拖放:sourceTableView和targetTableView。它们每个都有自己的tableViewController。 parentContainerViewController管理一个'滑出' UI允许用户使用“longPressGesture'在sourceTableView单元格上,导致sourceTableView滑出,暴露下面的targetTableView,此时用户可以放弃'拖动的单元格在targetTableView中的位置。一切正常,直到targetTableView增长到大约21-27行。一旦我们达到这个大小,如果我重新运行项目,我就开始得到NSInternalInconsistencyException。错误的详细信息如下:原因:'无效更新:第0节中的行数无效。更新后现有部分中包含的行数(27)必须等于该行中包含的行数更新前的部分(0),加上或减去从该部分插入或删除的行数(插入1个,删除0个),加上或减去移入或移出该部分的行数(0移入,0移动)出)'
起初我以为我遇到了竞争条件问题,因为更新前的行数是" 0"之后是" 27"。也许tableView在用户拖动项目并在tableView上调用insertIndex方法之前无法加载。但后来我注意到它工作正常,直到我们达到一定的长度。在这种情况下,竞争条件是没有意义的。现在我认为它与“可见细胞”有关。加载vs未加载。但为什么会是' 0' 0行?我一直在寻找答案。有许多NSInconsistency,但似乎没有回答我的具体问题。
这是告诉targetTableViewController将一个项插入其数据源然后告诉targetTableView insertRowsAtIndexPath的函数调用:
dragDropDataSource.tableView(self, insertDataItem: item, atIndexPath: indexPath)
self.beginUpdates()
self.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
self.endUpdates()
以下是实现上述调用的targetTableViewController代码:
func tableView(tableView: UITableView, insertDataItem dataItem : AnyObject, atIndexPath indexPath: NSIndexPath) -> Void {
if let di = dataItem as? DataItem {
data.insert(di, atIndex: indexPath.row)
}
data是存储' DataItems'的数组。它们显示在tableView行中。
此外。 targetTableView通过其viewDidLoad()中的调用初始化为getMyTopTen()
func getMyTopTen() {
let pwAPI = PowWowAPI()
pwAPI.getMyTopTen(self.boardId!) {
(entries:[Entry])in
for(var i=0; i < entries.count; i++) {
let dataItem = DataItem(indexes: String(i), entry: entries[i])
self.data.append(dataItem)
}
}
dispatch_async(dispatch_get_main_queue()) {
self.targetTableView.reloadData()
}
}
我希望我已经充分解释了这个问题。如果没有,请帮助我更好地提出这个问题。我很想在这里提问。