App crush:由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0部分中的行数无效

时间:2017-05-26 10:52:10

标签: ios swift xcode

import UIKit
import MapKit
import CoreLocation

class CourseClass2: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UITableViewDelegate, UITableViewDataSource {

  @IBOutlet weak
  var map: MKMapView!

    @IBOutlet weak
  var mapCourse: UIImageView!

    @IBOutlet weak
  var tableView: UITableView!

    struct User {

      var name: String
      var images: UIImage
      var coordinate: (Double, Double)
      var type: String
      var address: String
    }

  var rows = 0

  override func viewDidLoad() {
    super.viewDidLoad()

  }

  override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    insertRowsMode3()
  }

  func insertRowsMode2() {

    for i in 0.. < users.count {
      insertRowMode2(ind: i, usr: users[i])
    }

  }

  func insertRowMode2(ind: Int, usr: User) {

    let indPath = IndexPath(row: ind, section: 0)

    rows = ind + 1
    tableView.insertRows(at: [indPath], with: .right)
  }


  func insertRowsMode3() {

    rows = 0

    insertRowMode3(ind: 0)
  }

  func insertRowMode3(ind: Int) {
    let indPath = IndexPath(row: ind, section: 0)
    rows = ind + 1
    tableView.insertRows(at: [indPath], with: .right)

    guard ind < users.count - 1
    else {
      return
    }
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {

      self.insertRowMode3(ind: ind + 1)
    }
  }

  func numberOfSections( in tableView: UITableView) - > Int {

    return 1
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) - > Int {

    return rows
  }

  public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) - > UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
      for: indexPath) as!MyTableViewCell

    let user = users[indexPath.row]

    cell.MyImage.image = user.images
    cell.MyLabel.text = user.name
    cell.MyTypeLabel.text = user.type

    return (cell)
  }

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    performSegue(withIdentifier: "goToLast", sender: users[indexPath.row])

  }

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) - > CGFloat {
    return 100
  }

  override func prepare(
    for segue: UIStoryboardSegue, sender: Any ? ) {
    if segue.identifier == "goToLast" {

      guard
      let vc = segue.destination as ? FinalClass
      else {
        return
      }

      let guest = segue.destination as!FinalClass

      if let user = sender as ? User {

        guest.local = user.name

        guest.localImage = user.images

        guest.localType = user.type

        guest.localAddress = user.address
      }
    }
  }

  @IBAction func IndTapped(_ sender: Any) {
    self.performSegue(withIdentifier: "goBack", sender: self)

  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }


}

大家好,这是我得到错误的ViewController的代码,我添加了一个带有特定动画的tableView但是当我更改视图而不是回来时dismiss(animated: true, completion: nil)应用程序崩溃,因为有与行数据有些不一致。正如您所看到的,当我第一次访问此CourseClass2控制器时,我正在insertRowsMode3中调用viewDidAppear来设置行。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    insertRowsMode3()
}

问题是当我回来时,行数据与我用零初始化它并不相同,并且不会调用viewDidAppear。 我知道错误但我不知道如何更改我的代码以使其工作。我真的需要帮助。

应用程序正好在这个函数中粉碎

func insertRowMode3(ind:Int) {
        let indPath = IndexPath(row: ind, section: 0)
        rows = ind + 1
         tableView.insertRows(at: [indPath], with: .right)

        guard ind < users.count-1 else { return }
        DispatchQueue.main.asyncAfter(deadline: .now()+0.15) {

            self.insertRowMode3(ind: ind+1)
        }
    }

此处tableView.insertRows(at: [indPath], with: .right)

1 个答案:

答案 0 :(得分:0)

您在第0部分中提到了无效的行数: 在insertRowMode3中,您正在插入行但不更新表视图。 因此,即使更新,您的表视图也会在表视图中获得相同的行数,这就是不一致的地方。

使用tableview.beginUpdates(), 然后插入行, 增加你的行值, 然后tableview.endUpdates()

如果它没有帮助你,请告诉我。