删除单元格会导致崩溃

时间:2017-03-22 16:54:07

标签: ios swift uitableview

所以我的numberOfRowsInSection是:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard let delegate = delegate else { return 0 }
    return delegate?.comments.count + 1
}

我又添加了一个以补偿更多"加载更多"它位于表格视图的顶部(在这种情况下,它是第0行)。

这就是事情:当我想删除那个单元格时,加载更多"在获取最大数量的帖子后,它给了我一个错误:

The number of rows contained in an existing section after the update (12) must be equal to the number of rows contained in that section before the update (11), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

所以这里导致错误的函数:

func loadMore() {
    // loadMoreComments(completion:) inserts the new comment objects inside
    // the data source in the beginning of the list.
    delegate?.loadMoreComments(completion: { (isEndOfPosts, newCommentCount, comments) in
        self.didReachEndOfPosts = isEndOfPosts
        if isEndOfPosts {
            // indexPaths just returns [[0,1]], or, just one row.
            let indexPaths = self.createIndexPathsForNoMorePosts(newCommentCount: newCommentCount)
            self.tableView.beginUpdates()
            // error happens here.
            self.tableView.deleteRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)
            self.tableView.endUpdates()

            // assume only one post comes in, and that's the last one.
            self.tableView.beginUpdates()
            self.tableView.insertRows(at: indexPaths, with: .automatic)
            self.tableView.endUpdates()
        }
}

我想要完成的是:一旦我收到最后一篇文章,请删除"加载更多"单元格,并插入最后几个帖子,用最后几个帖子中的第一个替换0行。

1 个答案:

答案 0 :(得分:1)

您需要通知tableView的数据源有关细胞计数更改的信息。创建一个类变量,类似于

var shouldShowLoadMoreCell = true

而不是修改numberOfRowsInSection方法

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   guard let delegate = delegate else { return 0 }
   if shouldShowLoadMoreCell {
       return delegate?.comments.count + 1
   } else {
       return delegate?.comments.count
   }
}

最后,在需要时设置此标志

self.tableView.beginUpdates()
shouldShowLoadMoreCell = false
self.tableView.deleteRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)
self.tableView.endUpdates()