无效更新:第 0 节中出现无效行数错误

Posted

技术标签:

【中文标题】无效更新:第 0 节中出现无效行数错误【英文标题】:Invalid update: invalid number of rows in section 0 error occur 【发布时间】:2022-01-12 04:21:01 【问题描述】:

这是我的结构

struct CommunityListRM: Codable 
    let status       : Bool?
    let communityList: [CommunityList]?
    
    struct CommunityList: Codable 
        var id              : String?
        var user_id         : String?
        var icon            : String?
        var nickname        : String?
        var profile_image   : String?
        var content         : String?
        var image_1_url     : String?
        var image_2_url     : String?
        var image_3_url     : String?
        var image_4_url     : String?
        var image_5_url     : String?
        var image_ratio1    : String?
        var image_ratio2    : String?
        var image_ratio3    : String?
        var image_ratio4    : String?
        var image_ratio5    : String?
        var comment_qty     : String?
        var like_qty        : String?
        var date            : String?
        var created_at      : String?
        var updated_at      : String?
        var like_it         : String?
    

我想像 instagram 提要一样插入行

var posts        : [CommunityListRM.CommunityList] = []

NetworkService().request(.communityList, params, header)  [self] (response: DataResponse<CommunityListRM,AFError>) in
    switch response.result 
        case .success(let data):
        if let nComList = data.communityList 

           self.posts.append(contentsOf: nComList)
           print("selfpostcount\(self.posts.count)")
           self.tableview.beginUpdates()
           self.tableview.insertRows(at: [IndexPath(row: self.posts.count - 1, section: 0)], with: .none)
           self.tableview.endUpdates()
       
    

如果我尝试此代码错误发生

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后现有节中包含的行数(10)必须等于行数更新前包含在该节中的行数 (0),加上或减去从该节插入或删除的行数(1 插入,0 删除),加上或减去移入或移出该节的行数(0 移入, 0 移出)。表格视图:;层 = ;内容偏移:0, 0;内容大小:414, 0;调整后的ContentInset:0、0、0、0;

请帮帮我

【问题讨论】:

【参考方案1】:

首先begin-/endUpdates() 对单个插入/删除/移动操作毫无意义。


发生错误是因为您向数组中添加了多个项目,但只插入了一行。您必须指定所有索引路径。

如果 posts 为空 map 的所有索引 posts 到索引路径

self.posts.append(contentsOf: nComList)
let indexPaths = self.posts.indices.mapIndexPath(row: $0, section: 0)
self.tableview.insertRows(at: indexPaths, with: .automatic)

或者——因为你没有指定任何动画——只是重新加载表格视图

self.posts.append(contentsOf: nComList)
self.tableview.reloadData()

如果posts 不为空,则在追加项目之前和之后计算数组中的项目以获取开始和结束索引

let startIndex = self.posts.count
self.posts.append(contentsOf: newArray)
let endIndex = self.posts.count
let indexPaths = (startIndex..<endIndex).mapIndexPath(row: $0, section: 0)
self.tableview.insertRows(at: indexPaths, with: .automatic)

【讨论】:

非常感谢!!你的帖子很有帮助。我试过了,它有效!

以上是关于无效更新:第 0 节中出现无效行数错误的主要内容,如果未能解决你的问题,请参考以下文章

无效更新:第 0 节中的无效行数。更新后现有节中包含的行数 (3)

无效更新:第 0 节中的无效行数以 NSException 类型的未捕获异常终止

跨部分重新排序行时更新无效

NSInternalInconsistencyException 原因:'无效更新:第 0 节中的行数无效'

tableView 编辑委托方法不起作用(无效更新:第 0 节中的行数无效)

NSInternalInconsistencyException(无效更新:第 0 节中的行数无效)