我正在更新我的
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.长期解决方案是删除应用程序中的混合.