使用 Swift 在表格视图中插入部分

Posted

技术标签:

【中文标题】使用 Swift 在表格视图中插入部分【英文标题】:Insert section in table view with Swift 【发布时间】:2019-03-25 09:43:37 【问题描述】:

我正在尝试在 tableview 中插入一个新部分

let oldIns = insertCounter //insertCounter = 40
insertCounter += Int(INSERT_MESSAGES) // insertCounter = 80
let minn = min(insertCounter, Int(dbmessages.count))
print(minn) // minn = 80
tableView.beginUpdates()
tableView.insertSections(NSIndexSet(indexesIn: NSMakeRange(0, minn)) as IndexSet, with: .top)
tableView.endUpdates()


override func numberOfSections(in tableView: UITableView) -> Int 
    let a = min(insertCounter, Int(dbmessages.count))
    print(a) // after call insertSections a = 80
    return min(insertCounter, Int(dbmessages.count))


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 5

我收到一个错误:

无效更新:节数无效。段数 更新后的表视图中包含的 (80) 必须等于 更新前表格视图中包含的部分数(40), 加上或减去插入或删除的节数(插入 80 个, 0 个已删除)。

当我执行以下操作时:

tableView.insertSections(NSIndexSet(indexesIn: NSMakeRange(oldIns, minn)) as IndexSet, with: .top)

我得到错误:

异常'NSInternalInconsistencyException',原因:'试图 插入第 80 节,但更新后只有 80 节'

我做错了什么?

【问题讨论】:

不相关但NSIndexSet(indexesIn: NSMakeRange(0, minn)) as IndexSet 是可怕的objective-c-ish。这是斯威夫特:IndexSet(integersIn: 0..<minn)。首先,您必须更新数据源数组,然后插入行/节。在这种情况下,beginUpdates/endUpdates 毫无意义。 @vadian 是的,非常感谢,你可以添加为答案 【参考方案1】:

如所描述的错误,您的旧节数为 40,您插入了 80 个节,因此更新的节数应为 120。

override func numberOfSections(in tableView: UITableView) -> Int 
    let a = min(insertCounter, Int(dbmessages.count))
    print(a) // after call insertSections a = 80
    // you should return 120 instead of 80 here.
    return min(insertCounter, Int(dbmessages.count))

或者你可以这样插入

tableView.insertSections(NSIndexSet(indexesIn: NSMakeRange(oldIns, minn)) as IndexSet, with: .top)

【讨论】:

以上是关于使用 Swift 在表格视图中插入部分的主要内容,如果未能解决你的问题,请参考以下文章

使用Swift 3和CoreData删除表视图行

表格视图中的插入部分

在新部分的表格视图中插入一行

在表格视图单元格中添加集合视图 swift 3

快速单击表格中的按钮时删除和插入新按钮

iOS Swift 插入 sqlite FMDB