微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – Xcode 9 / iOS 11“CALayer界限包含NaN:[nan 0; nan 0]“当使用嵌套的UINavigationController和UITabBarController弹出视图控制器时

我正在更新我的 Xcode 9,Swift 4,iOS 11和iPhone X的应用程序.它似乎相对平稳,但每当我点击后退按钮时我的应用程序崩溃.我可以毫无问题地前进3-4个屏幕但是第一个后退按钮总是会崩溃应用程序.它不需要模拟器作为iPhone X运行.

它似乎没有陷入我的代码堆栈跟踪,所以这在我看来视图控制器的重绘阶段,我正在弹出,但我不确定.

因为我做了很多自定义绘图,因为在UITableViews和UIViews周围有自定义阴影我在所有位置设置了断点,我将其除以变量,但没有任何东西被击中.因此,似乎不是我的代码用零进行计算.

*** Terminating app due to uncaught exception 'CALayerInvalidGeometry',reason: 'CALayer bounds contains NaN: [nan 0; nan 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010af711cb __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010a8d3f41 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010afe5b95 +[NSException raise:format:] + 197
    3   QuartzCore                          0x0000000109424424 _ZN2CA5Layer10set_boundsERKNS_4RectEb + 230
    4   QuartzCore                          0x0000000109414c29 -[CALayer setBounds:] + 251
    5   UIKit                               0x0000000107267439 __27-[_UILabelLayer setBounds:]_block_invoke + 80
    6   UIKit                               0x000000010726717b -[_UILabelLayer _setFrameOrBounds:settingAction:] + 23
    7   UIKit                               0x00000001072673d8 -[_UILabelLayer setBounds:] + 155
    8   QuartzCore                          0x000000010941537c -[CALayer setFrame:] + 630
    9   UIKit                               0x0000000107267319 __26-[_UILabelLayer setFrame:]_block_invoke + 80
    10  UIKit                               0x000000010726717b -[_UILabelLayer _setFrameOrBounds:settingAction:] + 23
    11  UIKit                               0x00000001072672b8 -[_UILabelLayer setFrame:] + 155
    12  UIKit                               0x0000000106c4cf1e -[UIView(Geometry) setFrame:] + 368
    13  UIKit                               0x0000000106e4ec40 -[UILabel setFrame:] + 141
    14  UIKit                               0x0000000106fff254 -[UIButton _layoutTitleView] + 248
    15  UIKit                               0x0000000106fff3cf -[UIButton layoutSubviews] + 250
    16  UIKit                               0x0000000106c6c551 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1331
    17  QuartzCore                          0x000000010941b4ba -[CALayer layoutSublayers] + 153
    18  QuartzCore                          0x000000010941f5a9 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 401
    19  QuartzCore                          0x00000001093a81cd _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 365
    20  QuartzCore                          0x00000001093d3ae4 _ZN2CA11Transaction6commitEv + 500
    21  UIKit                               0x0000000106b97f4a _UIApplicationFlushRunLoopCATransactionIfTooLate + 167
    22  UIKit                               0x00000001074ef960 __handleEventQueueInternal + 6894
    23  CoreFoundation                      0x000000010af142b1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    24  CoreFoundation                      0x000000010afb3d31 __CFRunLoopDoSource0 + 81
    25  CoreFoundation                      0x000000010aef8c19 __CFRunLoopDoSources0 + 185
    26  CoreFoundation                      0x000000010aef81ff __CFRunLoopRun + 1279
    27  CoreFoundation                      0x000000010aef7a89 CFRunLoopRunSpecific + 409
    28  GraphicsServices                    0x00000001104e59c6 GSEventRunModal + 62
    29  UIKit                               0x0000000106b9dd30 UIApplicationMain + 159
    30  My Customer's Application Name      0x000000010475f087 main + 55
    31  libdyld.dylib                       0x000000010cfedd81 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
TL; DR:在我们的例子中,这个iOS 11 / Xcode 9错误是由将自定义UILabel添加到UINavigationItem.titleView的代码引起的.

这段代码是使用臭名昭着的混合技术 – [UINavigationItem setTitle:]选择器 – 以及调用原始的setTitle:方法编写的,我们的开发人员还使用与UINavigationItem.titleView属性相同的标题设置自定义标签.问题是使用setTitle:nil调用导航项时的情况,以便将空UILabel添加到具有零矩形维度的.titleView中,这导致UIKit崩溃.如果title:参数为nil,立即快速修复是停止设置.titleView.长期解决方案是删除应用程序中的混合.

附:我打开了一个雷达,请求改进此错误错误消息:

Xcode 9: Please improve error handling: -[UILabel setFrame:] and -[CALayer setFrame:] throws unfriendly exception if given a malformed CGRect

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐