gpt4 book ai didi

ios - UITableView单元格插入失败

转载 作者:行者123 更新时间:2023-11-30 12:09:33 25 4
gpt4 key购买 nike

我正在尝试制作一个可以具有可扩展标题 View 的 UITableView。当您按下标题 View 内的按钮时,将执行以下函数:

func expandTheCell(_ sender: UIButton) {
self.tableView.beginUpdates()

if sender.isExpanded == false {

postsArray.append("Hello")
tableView.reloadData()
print("Array Count: \(postsArray.count)")
self.tableView.insertRows(at: [IndexPath.init(row: 0, section: sender.tag)], with: .fade)

} else {
print("test")
}

self.tableView.endUpdates()
}

这是一些表格 View 函数:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {        
return postsArray.count
}

func numberOfSections(in tableView: UITableView) -> Int {
return 3
}

当我尝试插入行时,出现以下错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 1

为什么我无法插入单元格?我做错了什么?

最佳答案

我认为问题是由于当您将项目附加到 postsArray 时,各部分具有相同的 dataSource array ,在您的情况下为 postsArray单击按钮时,相同的 postsArray 用于其他部分,因此在 section 0 中插入行后,section 1 会提示该数量插入操作之前和之后的行数不同,但 section 0 不会提示,因为它在 postsArray 中具有相同的行数和项目数

现在这个问题可以通过两种方式解决:

第一种方法是您也可以为其他部分插入行,然后所有部分的行数与 postsArray 中的元素数相同

第二种方法是所有部分都有不同的数据源数组,例如第 1 部分使用 postsArray1,第 2 部分使用 postsArray2,其他部分也是如此。现在,在这种情况下,您不需要为其他部分插入行,因为每个部分都有不同的 dataSource 数组,更改一个部分不会影响其他部分。

我做了一个简单的项目来演示上述理论:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()

let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(buttonTapped(_:)))
self.navigationItem.rightBarButtonItem = addButton
}


var valuesFirstSection = ["value1", "value2", "value3"]
var valuesSecondSection = ["value1Second", "value2Second", "value3Second"]

//if you want to have the same dataSource array then use this

//var sharedValues = ["value1Shared", "value2Shared", "value3Shared"] // shared dataSource array


func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if section == 0 {
return valuesFirstSection.count
}else {
return valuesSecondSection.count
}
// //if you want to have the same dataSource array then
//use this

//return sharedValues.count;
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

if indexPath.section == 0 {
cell.textLabel?.text = valuesFirstSection[indexPath.row]


}else {

cell.textLabel?.text = valuesSecondSection[indexPath.row]

}
return cell

//if you want to have the same dataSource array then
//use this

//cell.textLabel?.text = sharedValues[indexPath.row]
//return cell

}

func buttonTapped(_ sender: UIBarButtonItem) {



//if you want to have the same dataSource array then
//you need to insert the rows for other sections as well
// sharedValues.insert("NewValue0", at: 0)
// self.tableView.insertRows(
// at: [IndexPath(row: 0, section: 0),
// IndexPath(row: 0, section: 1)
// ],
// with: .automatic)


valuesFirstSection.insert("NewValue0", at: 0)
self.tableView.insertRows(
at: [IndexPath(row: 0, section: 0)
],
with: .automatic)


}



}

希望这有帮助。

关于ios - UITableView单元格插入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com