我想通过单击按钮向UITableView添加新行

时间:2019-05-29 18:53:44

标签: ios arrays swift

当我单击添加按钮时,它返回错误“试图将第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
    }

}

我检查了我的桌子并添加了按钮,我不知道错误来自哪里

3 个答案:

答案 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/deleteRowscellForRowAt对于单个插入操作毫无意义。

beginUpdates/endUpdates