尝试移动 UITableView 行时崩溃

2023-11-26

我有一些相当复杂的规则来移动行UITableView。部分和每个部分的行数未定义,并且基于各种规则,用户可以将行在部分内或部分之间移动到特定的其他位置。

所有数据均已更新,一切正常。但有时,移动一行后,应用程序会出现故障,突然出现一个应显示行的空白区域。

我在用着:

              - (NSIndexPath *)tableView:(UITableView *)tableView
targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath

指定允许用户根据单元格所在位置拖动行的位置。 98% 的时间都有效。但在某些情况下,当用户只允许在部分之间拖动(无法重新排序部分内的行)时,会出现此错误,然后应用程序在滚动到没有行的区域后崩溃。

抛出的异常毫无用处:

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[NSCFArray objectAtIndex:]:索引 (6) 超出界限 (6)

我的代码都不在堆栈上。最后一个 UITableView 特定的方法是

-[UITableView(UITableViewInternal) _visibleCellForGlobalRow:]

有人见过这个问题吗?有任何想法吗?


我刚刚在我的应用程序中遇到了我认为相同的问题。

情况是我有两个表部分。可以在部分内和部分之间拖动项目。用户可以将单元格拖动到第一部分中的任何行,但在第二部分中,项目已排序,因此对于任何给定单元格,只有一个有效行。

如果我滚动视图,使第 1 部分的底部和第 2 部分的顶部可见,则抓取第 1 部分中排序到第 2 部分底部的项目,然后将其拖到第 2 部分的顶部,我的tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:方法被调用,我返回正确的目标位置,该位置位于屏幕底部下方的几行处。在 UI 中,您可以看到屏幕底部创建了一个空单元格,这不是正确的目标行。

当您放开单元格时,在屏幕底部(第 2 部分的中间)创建的虚假单元格会留在那里!tableView:cellForRowAtIndexPath:甚至从来没有被要求这样做。一旦你尝试用该单元格做任何事情,你就会崩溃。

我的第一个解决方案是在末尾调用 [tableView reloadData]tableView:moveRowAtIndexPath:toIndexPath:。但这会导致崩溃,所以我在延迟后间接调用它。但接下来还有anotherbug:延迟 reloadData 调用后,tableView:moveRowAtIndexPath:toIndexPath:再次被调用,并发出虚假请求,将项目移动到第一部分末尾之后的同一位置。因此,我必须添加代码来忽略虚假的无操作请求。

所以,这是代码:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)pathSrc toIndexPath:(NSIndexPath *)pathDst
{
  // APPLE_BUG: after doing the delayed table reload (see below), we get a bogus
  // request to move a nonexistant cell to its current location
  if (pathSrc.row == pathDst.row && pathSrc.section == pathDst.section)
    return;

  // update your data model to reflect the move...

  // APPLE_BUG: if you move a cell to a row that's off-screen (because the destination
  // has been modified), the bogus cell gets created and eventually will cause a crash
  [self performSelector:@selector(delayedReloadData:) withObject:tableView afterDelay:0];
}

- (void)delayedReloadData:(UITableView *)tableView
{
  Assert(tableView == self.tableView);
  [tableView reloadData];
}

请注意,仍然存在一个 UI 错误。在屏幕上,拖动的单元格会动画化为虚假的空单元格。在动画结束时,空单元格将使用该行的正确数据重新绘制,但细心的用户会注意到拖动的单元格被动画到错误的位置,然后立即变形为不同的单元格。

这绝对是一个愚蠢的用户界面。我考虑过将正确的目标行滚动到屏幕上,但如果我这样做,它将用第二部分填充屏幕,然后任何拖回到第一部分的尝试都会不断地被我的(现在烦人的)自动滚动所阻止。我可能必须更改 UI,但这需要对我的数据模型进行一些复杂且麻烦的更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试移动 UITableView 行时崩溃 的相关文章

  • 从 UIPickerView 的选定行设置 UIButton 的标题

    详细场景是这样的 我使用循环创建 10 个按钮并设置 0 9 的标签 点击每个按钮时 我将调用 UIPickerView 在其中加载来自不同数组的数据 到这里我就得到了预期的结果 但我希望 pickerView 中选定的行应设置为相应按钮的
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • 如何使用 iPhone 将照片上传到服务器?

    我正在编写一个 iPhone 应用程序 它可以拍摄照片然后将其上传到服务器 如何使用 Cocoa 将照片上传到服务器 我想我在某处使用 NSUrl Thanks Header interface EPUploader NSObject NS
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 直接在 XCode 中编译 Arm Assembly

    将arm汇编代码编译成xcode的最佳方法是什么 我有生成的那些程序集文件 有没有办法可以将 s 文件直接包含到我拥有的 C 代码中 或者我需要先运行一个预处理器 它将生成 o 文件 我可以将其与我的文件链接 如果是这样的话 在 XCode
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • ReactiveCocoa 将 SignalProducers 合二为一

    我正在使用 ReactiveCocoa 并且我有几个 SignalProducers let center NSNotificationCenter defaultCenter let signalProducer1 center rac
  • UIView animateWithDuration:delay: 工作很奇怪

    我在使用 iPhone 动画块时遇到了一个奇怪的问题 这段代码 UIView animateWithDuration 2 delay 0 options 0 animations void controller setBackgroundC
  • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

    按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
  • 在 appdelegate 中呈现多个模态视图

    我想在应用程序收到 application UIApplication application didReceiveRemoteNotification NSDictionary userInfo 中的每个推送消息后呈现一个 modalvi
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • UITableViewCell显示多种字体

    我想在 uitableviewcell 中以类似于 iPhone 地址簿的不同字体显示两个单词 例如 约翰Buchanan 您应该使用两个 UILable 或者您可以使用OH属性标签 https github com AliSoftware
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 使用 MapKit 的地形和卫星视图

    我是 Mapkit View 的新手 当我给出没有目的地的纬度和经度时 我想显示 MapKit中是否可以通过地形 卫星视图来显示地图 有教程链接吗 我看过一些访问 Google 地图 API html 文件 的示例 有必要吗 或者您可以通过
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模

随机推荐