当我单击添加按钮时,它返回错误“试图将第0行插入第0部分,但更新后第0部分中只有0行”
import UIKit
class PlacesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var addPointTableArray = [""]
@IBOutlet weak var addPointableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
addPointableview.delegate = self
}
@objc @IBAction func addPointButton(_ sender: Any) {
addPointableview.beginUpdates()
addPointableview.insertRows(at: [IndexPath(row: addPointTableArray.count - 1, section: 0)], with: .automatic)
addPointableview.endUpdates()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = addPointableview.dequeueReusableCell(withIdentifier: "addCell", for: indexPath as IndexPath) as! AddPointCellCell
cell.addPointTextfiedl.tag = indexPath.row
cell.addPointTextfiedl.addTarget(self, action: #selector(addPointButton(_:)), for: UIControl.Event.touchUpInside)
addPointableview.beginUpdates()
addPointableview.insertRows(at: [IndexPath(row: addPointTableArray.count-1, section: 0)], with: .automatic)
addPointableview.endUpdates()
return cell
}
}
我检查了我的桌子并添加了按钮,我不知道错误来自哪里
答案 0 :(得分:0)
您不应在cellForRow(at:)
方法中插入行。
您还需要更新数据模型,以便为这些新的indexPath提供数据。表格视图将询问新indexPaths上的单元格的数据以便刷新,如果数据模型未更新为包含新单元格的数据,则可能会崩溃。
答案 1 :(得分:0)
这不是在表视图中添加行的正确方法。
首先,您不必在tableView(_:cellForRowAt:)
中添加行。
需要更改表视图数据源才能实现所需的功能。 自从你写了这个
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
表视图始终期望有两行。
因此,首先,您必须返回数组的编号,因为它告诉表视图将显示多少行。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return addPointTableArray.count
}
然后,如果要添加新行,则需要在之前调用insertRows(at:with:)
来更新数组:
@IBAction func addPointButton(_ sender: Any) {
addPointTableArray.append("New element")
addPointableview.insertRows(at: [IndexPath(row: addPointTableArray.count - 1, section: 0)], with: .automatic)
}
您不需要调用beginUpdates()
和endUpdates()
,因为您只需要插入,这些方法就可以进行多次操作。
最后,如我之前所说,将tableView(_:cellForRowAt:)
更改为:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = addPointableview.dequeueReusableCell(withIdentifier: "addCell", for: indexPath) as! AddPointCellCell
cell.addPointTextfiedl.tag = indexPath.row
cell.addPointTextfiedl.addTarget(self, action: #selector(addPointButton(_:)), for: .touchUpInside)
return cell
}
所以最后您的课程看起来像
import UIKit
class PlacesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var addPointTableArray = [""]
@IBOutlet weak var addPointableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
addPointableview.dataSource = self
addPointableview.delegate = self
}
@IBAction func addPointButton(_ sender: Any) {
addPointTableArray.append("New element")
addPointableview.insertRows(at: [IndexPath(row: addPointTableArray.count - 1, section: 0)], with: .automatic)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return addPointTableArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = addPointableview.dequeueReusableCell(withIdentifier: "addCell", for: indexPath) as! AddPointCellCell
cell.addPointTextfiedl.tag = indexPath.row
cell.addPointTextfiedl.addTarget(self, action: #selector(addPointButton(_:)), for: UIControl.Event.touchUpInside)
return cell
}
}
我建议您在处理插入/删除操作之前重新研究如何实现基本表视图。
答案 2 :(得分:0)
表视图显示数据源阵列的内容。如果您使用的是insertRows
,则必须在更新UI之前将一个项目附加到数据源。
切勿在{{1}}中呼叫insert/deleteRows
。 cellForRowAt
对于单个插入操作毫无意义。
beginUpdates/endUpdates