我想在不使用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
}
}
可以给我你的建议吗?
答案 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()
。