【问题标题】:Crash on switching segment control切换段控制崩溃
【发布时间】:2017-11-29 19:21:08
【问题描述】:

我有一个顶部有 4 个段的表格视图。在第 1 段我加载了 76 行,在第 3 段我有 4 行,在第 4 段我有大约 25 行 & 在第 2 段没有任何内容。如果每个段中的行没有向下滚动并且如果所有这些行位于顶部(即第一行在每个段的总行数中可见)然后无论我如何切换选项卡,都不会发生任何崩溃。

但是,例如,如果在第 1 段,我向下滚动行然后移动到第 3 段,那么就会出现一个崩溃说 fatal error: Index out of range。可能是由于两个选项卡上的行数不匹配。但不确定修复。希望有人能帮忙...

【问题讨论】:

  • 你是哪个索引超出范围吗?这发生在哪个函数中?调用堆栈是什么?
  • 崩溃发生在cellForRowAt
  • 如果你需要一些有效的帮助,你需要发布你的代码
  • 您必须在段更改后重新加载表格。

标签: ios swift uisegmentedcontrol


【解决方案1】:

请检查您的情况是否满足以下条件?

  • 在更改 Segment Control 时,您必须重新加载 tableView 使用 NewDataSource,所以您要更改 UI,所以请 将reloadData的代码放到主线程中
  • 确保 numberOfRows 通过 Delegate 方法维护 while 更改段控制
  • 最后但同样重要的是,防止崩溃的另一种方法是, 你可以检查 indexPath.row cellForRowAtIndexPath 委托方法。这将肯定会防止索引超出范围而发生崩溃。

【讨论】:

  • @bvt 在这种情况下你什么都不用做。通常这永远不会发生 indexPath.row 会增加然后 yourArray.count 如果你做了完美的代码。该行仅用于防止崩溃。在您的情况下,唯一的一件主要事情是,在主线程中重新加载 tableview。就是这样,您不必每次在 0 索引处滚动 tableview。
  • @bvt ,你能告诉我你的代码你在改变段时做了什么
【解决方案2】:

从这种情况下,我了解到您对三个段使用相同的 UITableView 并且我知道您的呼叫 tableView.reloadData() 当您更改段时发生崩溃,因为一个段有更多数据而其他没有滚动 tableView 时。 tableView 的可见索引位置在其他段的数据源中不可用,因为只有你会崩溃,如果计数大于 0,则需要滚动到第 0 个索引,然后重新加载 tableView

在更改要填充的值之前单击其他段时,滚动回第 0 个索引

 if listArray.count > 0{
      let index = IndexPath(row: 0, section: 0)
      self.tableView.scrollToRow(at: index, at: .bottom, animated: false)
 } 

然后将clickedSegement 的值更改为listArray

然后重新加载tableview

self.tableView.reloadData()

希望对您有所帮助

【讨论】:

  • listArray 表示什么,@Ganesh Manickam?它是否表示包含行的所有数据的数组..?
  • @GaneshManickam,在点击段控制时,是否不需要滚动顶部的表格。你为什么建议这种类型的答案?
  • @bvt ,只要按照我的回答,你一定能防止崩溃。
  • 谢谢,@Ganesh Manickam。工作完美...:)
  • yes listArray 表示包含要在tableView @bvt 上填充的数据的数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
相关资源
最近更新 更多