应用程序崩溃:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效

Posted

技术标签:

【中文标题】应用程序崩溃:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效【英文标题】:App crush: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0 【发布时间】:2017-05-26 10:52:09 【问题描述】:
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 控制器时,我通过在viewDidAppear 中调用insertRowsMode3 来设置行。

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)

【问题讨论】:

请对您发布的代码进行一些审查。它就像200行。只留下我们需要查看的代码。谢谢 放置断点并检查遇到此错误的位置。 编辑@RinkiNegi 【参考方案1】:

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

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

如果对您没有帮助,请告诉我。

【讨论】:

我必须在哪里添加 view.beginUpdates() ?你能给我举个例子吗? 在此之前:tableView.insertRows(at: [indPath], with: .right) 你可以参考这个:self.tableViewSlotsDay.beginUpdates() self.AddCountSection1 = self.AddCountSection1 + 1 let indexPath = IndexPath(item: self.AddCountSection1 - 1, section: 0) self.tableViewSlotsDay. insertRows(at: [indexPath], with: .fade) self.tableViewSlotsDay.endUpdates() 好的理解,只有 'AddcountSection' 我不知道我要在这个函数中插入什么来创建它 不,那只是行数(tableview 中的行数)。我根据我的需要通过这个变量来维护它。您正在使用“行变量”进行维护,只需替换这些词。

以上是关于应用程序崩溃:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效的主要内容,如果未能解决你的问题,请参考以下文章

尝试显示带有消息的 UIAlertController 时应用程序崩溃:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

iOS 崩溃:由于未捕获的异常原因而终止应用程序:UIPopoverPresentationController 应该有一个非零的 sourceView

iOS未捕获的异常添加子视图崩溃

应用程序崩溃:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效

由于未捕获的异常“NSRangeException”而导致应用程序终止

目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序