将动画添加到tableview(Swift)后应用程序崩溃

时间:2018-02-23 11:24:24

标签: ios swift uitableview swift4

我试图在加载时在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,但应用程序仍在崩溃,我需要做些什么来解决这个问题?

1 个答案:

答案 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)
    }
}