草庐IT

ios - UITableView 在删除末尾的项目时崩溃

coder 2023-09-23 原文

我有一个带有一堆部分/行的 UITableView。我一直被一个奇怪的错误所困扰,当我删除一行时,我的程序会崩溃。我的删除代码如下:

[self.tableView beginUpdates];
NSMutableArray* myArray = [self.myArray mutableCopy];
[myArray removeObjectAtIndex:indexPath.row];
self.myArray = myArray;

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

调试器在 endUpdates 上向我抛出以下错误。

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

现在,为了节省大家一些时间,我已经进行了广泛的测试和验证,我的数据源更新和删除正确的 indexPath 的一切都是绝对正确的。我只是注意到,只有当我一直滚动到我的 tableview 底部以至于我无法再滚动,然后删除页面可见区域中的一个单元格时,才会出现此问题。

我可以在我的 tableview 中的任何其他地方正确删除,只要它下面有更多屏幕外的内容,但是一旦我在 tableview 的末尾,删除就会抛出这个错误。

如果有帮助,我基本上在 UIPageViewController 中有一个 UITableViewController(普通样式)。我已经尝试删除 UIPageViewController 并只是推送到 UITableViewController,但仍然会出现此错误。

有谁知道我该如何克服这个问题?

编辑:

似乎很多人仍然认为它可能是数组,但事情就是这样。我可以在我的表格 View 中移动我的部分(所有部分都有可以删除的行)。当 tableview 完全滚动到底部时,删除任何可见部分中的行时,我总是会崩溃。此代码片段被抽象并用于所有部分,因此我非常确定代码是正确的。

当我在 tableview 居中的部分中删除一行时,我注意到该行向上滑动以删除,即使我说要使用淡入淡出动画。动画将其下方的行或部分动画化,这是正确的行为。我觉得这可能与当 tableview 到达其内容末尾时有关,它试图向上滚动某些内容,但那里什么也没有。

破解: 我刚才实现的一个 hack 是在 tableView.tableFooterView 中放置一个与我的 tableView 大小相同的普通 UIView。这导致我的 tableView 具有更大的可滚动大小,这是我不喜欢的,但有了它,崩溃不会发生,因为当最后一个单元格被删除时有更多的可滚动空间向上移动。如果我不必执行此操作,我将不胜感激。

好吧,它似乎只有在页脚 View 非常大的情况下才有效。如果我将页脚 View 变小,例如 100 像素,当您滚动到 tableview 的边缘时它仍然会崩溃。

堆栈跟踪:(调试器将首先崩溃到上面代码中的 endUpdates 行,当我在调试器上再次点击播放时,出现此堆栈跟踪)

2014-07-18 05:52:41.314 ScriptChart[26419:905949] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000109c9f055 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010d1d8a1c objc_exception_throw + 45
    2   CoreFoundation                      0x0000000109b6d92a -[__NSArrayM insertObject:atIndex:] + 954
    3   UIKit                               0x000000010b86c424 __46-[UITableView _updateWithItems:updateSupport:]_block_invoke915 + 177
    4   UIKit                               0x000000010b803a4c +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] + 473
    5   UIKit                               0x000000010b803ca1 +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:] + 57
    6   UIKit                               0x000000010b86bfc3 -[UITableView _updateWithItems:updateSupport:] + 2803
    7   UIKit                               0x000000010b8660b2 -[UITableView _endCellAnimationsWithContext:] + 11934
    8   ScriptChart                         0x000000010863f272 -[SCLabListNoteSection deleteCell:] + 1250
    9   ScriptChart                         0x00000001085e127f __45-[SCLabPanelTableViewCell infoButtonPressed:]_block_invoke127 + 207
    10  UIKit                               0x000000010b9e0fe7 -[UIAlertController _fireOffActionOnTargetIfValidForAction:] + 55
    11  UIKit                               0x000000010b9e14d5 __85-[UIAlertController _dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:]_block_invoke + 30
    12  UIKit                               0x000000010b892bc4 -[UIPresentationController transitionDidFinish:] + 1118
    13  UIKit                               0x000000010b894d8e __56-[UIPresentationController runTransitionForCurrentState]_block_invoke_2 + 133
    14  UIKit                               0x000000010bec4123 -[_UIViewControllerTransitionContext completeTransition:] + 110
    15  UIKit                               0x000000010b8037fd -[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 326
    16  UIKit                               0x000000010b7ec42a -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 209
    17  UIKit                               0x000000010b7ec760 -[UIViewAnimationState animationDidStop:finished:] + 76
    18  QuartzCore                          0x000000010b4dff9e _ZN2CA5Layer23run_animation_callbacksEPv + 308
    19  libdispatch.dylib                   0x000000010d537d64 _dispatch_client_callout + 8
    20  libdispatch.dylib                   0x000000010d523f82 _dispatch_main_queue_callback_4CF + 941
    21  CoreFoundation                      0x0000000109c07ae9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    22  CoreFoundation                      0x0000000109bca46b __CFRunLoopRun + 2043
    23  CoreFoundation                      0x0000000109bc9a06 CFRunLoopRunSpecific + 470
    24  GraphicsServices                    0x000000010db6cabf GSEventRunModal + 161
    25  UIKit                               0x000000010b792cf8 UIApplicationMain + 1282
    26  ScriptChart                         0x00000001085ca153 main + 179
    27  libdyld.dylib                       0x000000010d56c145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

最佳答案

你是在调用 scrollToRowAtIndexPath 吗?这可能会导致崩溃。

关于ios - UITableView 在删除末尾的项目时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824646/

有关ios - UITableView 在删除末尾的项目时崩溃的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  7. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  8. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  9. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  10. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

随机推荐