【问题标题】:UITableView crash gives 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [160 nan]'UITableView 崩溃给出'CALayerInvalidGeometry',原因:'CALayer 位置包含 NaN:[160 nan]'
【发布时间】:2011-01-27 19:09:55
【问题描述】:

我的应用中有一个自定义表格视图。我已经对一次加载 25 行的表实现了“加载更多”功能。问题是在加载 2 次后应用程序崩溃并给出“CALayerInvalidGeometry”,原因:“CALayer 位置包含 NaN:[160 nan]”作为 OS 4.2 及更高版本的错误。

在低于 4.2 的操作系统上,其中一个单元格丢失,表格中间有空格。它不会造成任何崩溃。但它仍然给出了上面提到的错误。

我检查代码中除以 0 的位置,但我找不到。按照我喜欢的堆栈跟踪。所以我什至无法检查这个异常发生在哪里。

有人知道吗??

    0   CoreFoundation                      0x020ccbe9 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x022215c2 objc_exception_throw + 47
 2   CoreFoundation                      0x02085628 +[NSException raise:format:arguments:] + 136
 3   CoreFoundation                      0x0208559a +[NSException raise:format:] + 58
 4   QuartzCore                          0x0182396a _ZL18CALayerSetPositionP7CALayerRKN2CA4Vec2IdEEb + 177
 5   QuartzCore                          0x018238b5 -[CALayer setPosition:] + 42
 6   QuartzCore                          0x018237cc -[CALayer setFrame:] + 763
 7   UIKit                               0x0073c307 -[UIView(Geometry) setFrame:] + 255
 8   UIKit                               0x008c718a -[UITableViewCell setFrame:] + 166
 9   UIKit                               0x0077aa08 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 1160
 10  UIKit                               0x0077077f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
 11  UIKit                               0x00785450 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
 12  UIKit                               0x0077d538 -[UITableView layoutSubviews] + 242
 13  QuartzCore                          0x01828451 -[CALayer layoutSublayers] + 181
 14  QuartzCore                          0x0182817c CALayerLayoutIfNeeded + 220
 15  QuartzCore                          0x0182137c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
 16  QuartzCore                          0x018210d0 _ZN2CA11Transaction6commitEv + 292
 17  QuartzCore                          0x018517d5 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
 18  CoreFoundation                      0x020adfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
 19  CoreFoundation                      0x020430e7 __CFRunLoopDoObservers + 295
 20  CoreFoundation                      0x0200bbd7 __CFRunLoopRun + 1575
 21  CoreFoundation                      0x0200b240 CFRunLoopRunSpecific + 208
 22  CoreFoundation                      0x0200b161 CFRunLoopRunInMode + 97
 23  GraphicsServices                    0x02611268 GSEventRunModal + 217
 24  GraphicsServices                    0x0261132d GSEventRun + 115
 25  UIKit                               0x0071542e UIApplicationMain + 1160

【问题讨论】:

  • 奇怪的是这个错误只发生在表格的第 43 行。其余所有行显示正常。
  • 这个问题让我失眠了很多,有人有什么好主意吗?
  • 我们需要查看代码来帮助您。
  • 请提供 loadMore 代码。我在我的应用程序中这样做没有任何问题。

标签: iphone uitableview


【解决方案1】:

我有同样的错误,因为不是写

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { ... }

我写道:

- (NSInteger)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { ... }

(注意返回值)。 希望这对某人有所帮助。

【讨论】:

  • 我浪费了一整天.. 现在终于解决了这个问题.. 谢谢@Moszi
  • 谢谢!这也救了我!要是我早点看到这个就好了!
  • 谢谢!不知怎的,我把它写成了一个布尔值!
  • 令人着迷。怎么至少有 24 人对回调方法的返回值使用了错误的类型?
【解决方案2】:

当异常发生时,堆栈跟踪看起来 UITableView 正忙于布局可见单元格。由于单元格的位置似乎设置为NaN 值,因此必须询问这是如何发生的。

假设 UITableView 布局代码中没有错误,发生这种情况的唯一方法是您在表格视图委托中实现 tableView:heightForRowAtIndexPath: 并返回错误的高度(或相应的页眉或页脚方法之一)。

编辑以查明异常的确切原因:

我假设您根据字符串的几何大小计算了单元格的高度(使用UIStringDrawing-[NSString sizeWithFont:])。当您向 nil 值发送消息时,返回值通常是 nil、0、NO 或任何由全位零字表示的值。

对于返回结构的方法(如sizeWithFont:),这是不正确的。返回的结构根本没有初始化,它的元素包含随机值。

在您的情况下,您可能使用了 CGSize 结构的未初始化元素之一,后来证明它不是有效的 IEEE 754 浮点值。

附录: 从 clang 3.0 开始,从消息返回的结构初始化为 {0}(所有位为零)。所以上面的问题应该不会再发生了。

【讨论】:

  • 我确实实现了 tableView:heightForRowAtIndexPath: 来返回自定义行高,但我不确定它如何返回错误的高度?你能详细说明一下吗?
  • 您有权认为它与 tableView:heightForRowAtIndexPath: 方法有关,我对此进行了注释,它现在可以正常工作并且不会崩溃。但对于我的应用程序,我需要能够动态更改行高以适应内容。您对我如何做到这一点并返回一个不错的值使其不会崩溃有任何建议吗?
  • 好吧,我明白了,原来我没有检查是否有一个空字符串搞砸了高度谢谢,当它让我在 3 小时内我会奖励你的赏金
  • 我没有在我的代码中动态设置表格的行高。我通过设置 tableView.rowHeight 定义了视图加载时的行高。所以我不知道这个问题发生在哪里。我还检查了是否收到任何空字符串。但是不,所有的字符串都是正确的。此崩溃是随机发生的。有时它会起作用,但有时它不会,它总是发生在同一行。
  • 它发生在设备或模拟器上还是两者兼而有之?您是否使用任何其他几何覆盖(如tableView:heightForHeaderInSection:tableView:heightForFooterInSection:)?你能发布项目吗?
【解决方案3】:

Messages to nil that return structs of structs can return undefined values in the inner struct.

实际上,这意味着从nil UIView 获取frame 可以在framesize 字段中返回未定义的值。这个虫子咬了我,我很惊讶。

【讨论】:

    【解决方案4】:

    简单的答案:

    从任何与高度相关的委托方法返回 NaN 都会导致此错误。

     tableView:heightForRowAtIndexPath:
     tableView:heightForHeaderInSection:
     tableView:heightForFooterInSection:
    

    等等。

    可能有其他方法会产生此错误,但如果您使用的是 UITableView,请先检查一下!

    【讨论】:

      【解决方案5】:

      对我来说,这是由于此代码中的 toView 为 nil 造成的:

          [UIView transitionFromView:self.fromView
                              toView:self.toView
                            duration:0.6
                             options:(currentPage > toPage ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp)
                          completion:^(BOOL finished) {
                              if (finished) {
                              }
                          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-17
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 2017-05-11
        • 2019-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多