题 UITableView崩溃给出'CALayerInvalidGeometry',原因:'CALayer位置包含NaN:[160 nan]'


我的应用程序中有自定义表格视图。我已经在表中实现了“加载更多”功能,一次加载25行。问题是在加载2次app崩溃后给出'CALayerInvalidGeometry',原因:'CALayer position包含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

18
2018-01-27 19:09


起源


我有同样的问题 - krasnyk
奇怪的是,这个错误只发生在表的第43行。休息所有行显示正常。 - Tarang
这个问题让我失去了太多的睡眠,任何人都有任何好主意? - marchinram
我们需要查看代码来帮助您。 - viggio24
请提供loadMore代码。我在我的应用程序中没有任何问题。 - VdesmedT


答案:


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

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

我写了:

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

(注意返回值)。 希望这有助于某人。


27
2018-03-16 22:21



你让我今天很开心 - clopez
我浪费了一整天......现在终于解决了问题..谢谢@Moszi - Rupesh
谢谢!这也救了我!如果我之前只看到过这个! - Paul Cooper
你是我的英雄!这个问题坚持了这么久!!! - darshansonde
谢谢!不知怎的,我把它写成了一个布尔! - John Gibb


堆栈跟踪看起来像UITableView在发生异常时忙于布局可见单元格。由于单元格的位置似乎设置为a NaN 价值必须要问这是怎么发生的。

假设UITableView布局代码中没有错误,唯一可能的方法就是实现 tableView:heightForRowAtIndexPath: 在您的表视图中委托并返回一个错误的高度(或一个相应的页眉或页脚方法)。

编辑 确定异常的确切原因:

我假设你从字符串的几何尺寸计算出单元格的高度(使用 UIStringDrawing-[NSString sizeWithFont:])。当您将消息发送到nil值时,返回值通常为nil,0,NO,或者由all-bits-zero字表示的任何值。

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

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

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


21
2018-02-08 15:53



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


返回结构结构的nil消息可以在内部结构中返回未定义的值。

实际上,这意味着得到了 frame 从一个 nil  UIView 可以返回未定义的值 size 的领域 frame。这个错误让我感到困惑,我很惊讶。


5
2017-09-08 19:17





简单的答案: 

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

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

等等..

可能还有其他方法可以产生此错误,但如果您正在使用UITableView - 请先检查一下!


2
2018-04-15 20:36





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

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

0
2018-05-05 18:30