当前位置: 首页 > 面试题库 >

iOS8 Swift:deleteRowsAtIndexPaths崩溃

逄皓轩
2023-03-14
问题内容

在Swift,iOS 8,Xcode 6 Beta 6中,我从tableView中删除一行时遇到了一些麻烦。每次尝试删除一行时,都会出现以下错误:

/ [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim /
UIKit-3302.3.1 / UITableView.m:1581 2014-08-30
20:31:00.971类目录[13290:3241692]的断言失败未捕获的异常’NSInternalInconsistencyException’,原因:’无效的更新:第1节中的行数无效。更新(25)之后现有节中包含的行数必须等于更新前该节中包含的行数(25),加上或减去从该部分插入或删除的行数(已插入0,已删除1),以及加上或减去移入或移出该部分的行数(0移入,0移出)。

在这里,我已经阅读了有关此常见问题的所有答案,并认为我已满足建议的条件。 该项目 似乎 已从数据模型中删除-
当我重新加载应用程序时,已删除的项目已从表中删除-
但适当的sqlite文件中似乎还有一些残留,当然,数学也不会累加。退出indexPath的println显示正确的Section和Row。我很困惑
这应该很简单,但是我肯定会丢失一些愚蠢的东西,我怀疑是在删除数据模型。Github上的完整项目。

func numberOfSectionsInTableView(tableView: UITableView!) -> Int {

    return fetchedResultController.sections.count

}


func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    return fetchedResultController.sections[section].numberOfObjects

    }

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = tableViewMain.dequeueReusableCellWithIdentifier("CellMain", forIndexPath: indexPath) as UITableViewCell

        let personForRow = fetchedResultController.objectAtIndexPath(indexPath) as Person
        cell.textLabel.text = personForRow.fullName()

        return cell

}

func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool {
    return true
}

func tableView(tableView: UITableView!, editingStyleForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCellEditingStyle {
    return UITableViewCellEditingStyle.Delete
}

 func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
    println("section and row \(indexPath.section) \(indexPath.row) ")
    if (editingStyle == UITableViewCellEditingStyle.Delete) {
    let personForRow : NSManagedObject = fetchedResultController.objectAtIndexPath(indexPath) as Person
    context?.deleteObject(personForRow)
    context?.save(nil)
        tableViewMain.beginUpdates()
    tableViewMain.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
        tableViewMain.endUpdates()
    }

问题答案:

使用Xcode Core Data Master-
Detail模板项目很容易重现崩溃。通常,当您使用时NSFetchedResultsController,您应该真正使用NSFetchedResultsControllerDelegate(您已声明但不使用它)。

删除tableView:commitEditingStyle:forRowAtIndexPath:方法中的这些行:

tableViewMain.beginUpdates()
tableViewMain!.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
tableViewMain.endUpdates()

并将这些行添加到您的viewController类中:

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableViewMain.beginUpdates()
}

func controller(controller: NSFetchedResultsController!, didChangeSection sectionInfo: NSFetchedResultsSectionInfo!, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
    switch type {
    case .Insert:
        tableViewMain.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
    case .Delete:
        tableViewMain.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
    default:
        return
    }
}

func controller(controller: NSFetchedResultsController!, didChangeObject anObject: AnyObject!, atIndexPath indexPath: NSIndexPath!, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath!) {
    switch type {
    case .Insert:
        tableViewMain.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)
    case .Delete:
        tableViewMain.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    case .Update:
        return
        //Should also manage this case!!!
        //self.configureCell(tableView.cellForRowAtIndexPath(indexPath), atIndexPath: indexPath)
    case .Move:
        tableViewMain.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        tableViewMain.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)
    default:
        return
    }
}

func controllerDidChangeContent(controller: NSFetchedResultsController!) {
    tableViewMain.endUpdates()
}

这应该可以解决您的问题。



 类似资料:
  • 我试图在solaris机箱中使用远程Weblogic服务器配置jProfiler。服务器正常启动,但是当我将jProfiler GUI连接到服务器时,出现以下错误,服务器崩溃。tmp目录具有足够的访问权限和空间。我可以看到一些文件,比如jpcOYaysx,是在tmp目录中创建的。有人能帮我解决这个问题吗?我们是否有特定于jProfiler的日志,如何配置它? 我找不到任何帮助页面/文档编辑jPro

  • 问题内容: 今天在工作中,我的日食开始反复崩溃。只需打开它并开始编辑文件,几分钟后即可崩溃。我重新安装了所有内容:Eclipse,Workspace,Java,但没有任何帮助。由于我目前无法工作,请尝试确定问题的根源。 (…) 问题答案: 这是C2编译器中的一个已知JVM错误:JDK-8154831。 尝试添加以下JVM参数:

  • 仅供参考;这不需要回答。 我在一个负载很重的Postgres服务器上工作,发出了一个挂起的GRANT命令。它没有被任何其他命令阻止。我有几个打开的连接,并且能够用一个普通的pg_cancel_backend(SIGTERM)命令杀死几个进程,但我的GRANT命令没有响应该命令或pg_ terminate_backde(SIGINT)。我最后尝试了“kill-9(pid)”(SIGKILL),服务器

  • Project My Application11在运行Gradle时使用以下JDK位置:C:/Program Files/Android/Android Studio1/jre在不同进程上使用不同的JDK位置可能会导致Gradle生成多个守护进程,例如,在使用Android Studio时从终端执行Gradle任务。更多信息。。。 显示此错误后自动关闭而不显示任何错误。 尝试了jdk 8和13,并

  • 崩溃(Crash),即闪退,多指在移动设备(如:iOS、Android设备)中,在打开应用程序时出现的突然退出中断的情况。 如果App应用的线上版本发生过多的崩溃,会影响用户体验,导致用户流失,以及可能减少收益。 诸葛io的「App崩溃分析」功能,可以帮助产品、运营人员对App应用发生崩溃的次数、影响的人数进行监测,也可以查看崩溃路径,还原崩溃场景,了解用户是如何一步一步发生的崩溃。同时,可以协助

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩