我试图在加载时在tableView中向insertRows添加动画,这些是我创建的动画函数
func insertRowsMode3() {
insertRowMode3(ind: 0)
}
func insertRowMode3(ind:Int) {
let indPath = IndexPath(row: ind, section: 0)
rows = ind + 1
tableView.beginUpdates()
tableView.insertRows(at: [indPath], with: .right)
tableView.endUpdates()
guard ind < rows-1 else { return }
DispatchQueue.main.asyncAfter(deadline: .now()+0.20) {
self.insertRowMode3(ind: ind+1)
}
}
这些是我的numberOfRow和numberOfSection
func numberOfSections(in tableView: UITableView) -> Int {
print("numberOfsection Call")
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("numberOfRows Call")
if places.count < self.numberPlaces {
return places.count
}
return self.numberPlaces
}
这是我的viewDidAppear
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
insertRowsMode3()
}
numberPlaces,places和rows是Int变量,无论如何我的应用程序都因此错误而崩溃
&#34;因未捕获的异常而终止应用 &#39; NSInternalInconsistencyException&#39;,原因:&#39;尝试插入第0行 进入0部分,但是在0之后的0部分只有0行 更新&#39;&#34;
我已经尝试用rows
替换numberPlaces
,但应用程序仍在崩溃,我需要做些什么来解决这个问题?
答案 0 :(得分:2)
您在那里插入一个新行,但您没有更新它背后的模型。之后有一个不存在 - 这个方法也必须更新行数。
模型和UI之间必须始终保持一致!因此,如果及时n
numberOfRowsInSection
返回3,并且tableView
中已有3行,那么如果及时n + 1
,则调用insertRows
添加行,那么你必须确保那个时间的numberOfRowsInSection
将返回4(即3 + 1,因为你添加了1行)。因此,您必须重新编写整个代码。
您可以通过以下方式尝试:
// use an additional array for the rows to add them to tableView
var currentPlaces: [Place] = []
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// use this as numberOfRowsInSection
return currentPlaces.count
}
func insertRowMode3(ind: Int) {
let indPath = IndexPath(row: ind, section: 0)
// the model behind the tableView HAS to match the inserts/deletes
currentPlaces.append(places[ind])
tableView.insertRows(at: [indPath], with: .right)
// use proper guard
guard ind < places.count - 1 else { return }
DispatchQueue.main.asyncAfter(deadline: .now()+0.20) {
self.insertRowMode3(ind: ind+1)
}
}