无法在swift中将数据插入UITableView

时间:2018-01-09 08:07:07

标签: ios swift uitableview

我想在不使用reloadData()方法的情况下将新数据数组插入UITableView。

我创建了简单的代码来做到这一点。 我提到this discussion。 但是,发生了错误。 我调查了为什么会发生错误,但我找不到它。

我的源代码在这里。

<?php

echo "hello <br>";

class gang {

    public function __construct() {
        echo "parent constructor call <br>";
        }

        public function fetchOperators() {
        echo "fetchOperators accessed <br>";
    }

}

class bang extends gang {

    private $operators;

    public function __construct() {
        echo "constructor call <br>";
    }

}

$ob = new bang();
$ob2 = new gang();
$ob->fetchOperators();

并且,错误消息在这里。

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    var objects = [
        "Apple",
        "Orange"
    ]

    let insertObjects = [
        "Banana",
        "Grape"
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func insert(_ sender: Any) {
        self.objects = self.insertObjects + self.objects
        tableView.beginUpdates()
        let indexPath = IndexPath(row: 0, section: 0)
        tableView.insertRows(at: [indexPath], with: .automatic)
        tableView.endUpdates()
    }


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

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

        cell.label.text = self.objects[indexPath.row]
        return cell
    }
}

可以给我你的建议吗?

2 个答案:

答案 0 :(得分:1)

您应该重写此功能,如:

@IBAction func insert(_ sender: Any) {
    objects = insertObjects + objects
    let indexPaths = (0..<insertObjects.count).map({ IndexPath(row: $0, section: 0) })
    tableView.insertRows(at: indexPaths, with: .automatic)
}

由于insertObjects有2个元素,因此您需要重新加载两个IndexPath或仅调用tableView.reloadData()而不是begin/endUpdates代码。

答案 1 :(得分:1)

在第一次重新加载后插入新对象时,必须为每个插入的对象提供IndexPath

当项目插入表格的开头时,此解决方案会计算新项目的数量并将索引映射到IndexPath s

@IBAction func insert(_ sender: Any) {
    let numberOfItemsToInsert = self.insertObjects.count
    let indexPaths = (0..<numberOfItemsToInsert).map{IndexPath(row: $0, section: 0)}
    self.objects = self.insertObjects + self.objects
    tableView.insertRows(at: indexPaths, with: .automatic)
}

与往常一样,单个插入操作不需要begin-/endUpdates()