【问题标题】:iOS/Swift: tableView cellForRowAtIndexPath crashiOS/Swift:tableView cellForRowAtIndexPath 崩溃
【发布时间】:2016-04-17 00:03:02
【问题描述】:

我在第 389 行遇到 EXC_BREAKPOINT 崩溃

386    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
387        let cell = tableView.dequeueReusableCellWithIdentifier("StationsCell", forIndexPath: indexPath)
388        cell.textLabel?.text = self.suggestionStations?[indexPath.row]
389        return cell
390    }

这是来自 Crashlytics 的崩溃报告,发生在 2% 的用户中:

Thread : Crashed: com.apple.main-thread 0 Trenìt! 0x10004a2e4 specialized MasterViewController.tableView(UITableView, cellForRowAtIndexPath : NSIndexPath) -> UITableViewCell (MasterViewController.swift:389) 1 Trenìt! 0x100046488 @objc MasterViewController.tableView(UITableView, cellForRowAtIndexPath : NSIndexPath) -> UITableViewCell (MasterViewController.swift) 2 UIKit 0x18c6b239c -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 544 3 UIKit 0x18c6a6fc4 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2360 4 UIKit 0x18c49cc60 -[UITableView layoutSubviews] + 172 5 UIKit 0x18c3b9874 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 572 6 QuartzCore 0x18bd11d58 -[CALayer layoutSublayers] + 168 7 QuartzCore 0x18bd0c944 CA::Layer::layout_if_needed(CA::Transaction*) + 320

知道为什么会这样吗?

【问题讨论】:

  • 单元格可能是nil。你检查了吗?
  • 崩溃日志中是否有人类可读的错误消息?
  • @rmaddy 这是我能得到的唯一崩溃日志,它来自 Crashlytics
  • @ozgur,单元格是否有可能有时为零,有时不是?考虑到返回值UITableViewCell不是可选的,如果单元格为nil,我该怎么办?
  • 这段代码有没有可能总是崩溃,但只有 2% 的用户使用它?比如它是否提供了一些很少需要的功能?

标签: ios swift uitableview


【解决方案1】:

崩溃是由suggestionStations 数组在索引处没有值引起的。

当数组重置为 0 时,我没有在表上调用 ReloadData()。因此,当索引处的值不再存在时,表函数仍然在竞争条件下被调用。

修复方法是在重置数组后调用 ReloadData()。否则可能会检查是否为数组定义了索引,但如果每次都正确调用 reloadData,则不需要这样做。

【讨论】:

    【解决方案2】:

    我们遇到了同样的问题。此问题在 iOS 10 beta1 上 100% 可重现。

    虽然难以置信,但我们设法通过在情节提要上提供一个非常短的单元格标识符来解决此问题。像“PhoneContactCell”重命名为“PCell”。

    经过一番调查,我们有点认为这是一个故事板错误:如果一个单元原型被复制和修改,那么它可能会出现这个问题。

    【讨论】:

    • 我们找到了导致崩溃的原因。我们使用了一个名为 FoundationExtension 的第 3 方库,其中在其 NSObject 类别中覆盖了伺服内存管理调用。我们删除了这个库,它可以工作了。
    【解决方案3】:

    确保您已在 Main.Storyboard 中明确将您的单元格标识符设置为“StationsCell”。选择单元格并转到属性检查器。

    还要在函数前加上override,所以应该是override func

    【讨论】:

    • 如果没有设置,它总是会崩溃,而不仅仅是 2% 的用户。
    • 这是一个奇怪的问题,我也遇到了同样的问题,无法重现,但一些用户在启动时遇到应用程序崩溃及其 EXC_Breakpoint。我确实复制了 tableview 和原型单元格。将重新创建并推送构建。如果解决了问题,将在这里发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2017-06-12
    • 2018-03-27
    • 2021-04-17
    相关资源
    最近更新 更多