我已将 iOS 应用程序从 UIKit 迁移到 SwiftUI。我最近发布了 SwiftUI 版本,昨天 Crashlytics 报告了一个崩溃,我不知道如何修复,因为我不知道崩溃发生在哪里。
崩溃报告是这样说的:
_userInfoForFileAndLine
NSInternalInconsistencyException - attempt to insert item 268 into section 0, but there are only 0 items in section 0 after the update
Fatal Exception: NSInternalInconsistencyException
Attempted to scroll the collection view to an out-of-bounds item (0) when there are only 0 items in section 0. Collection view: <_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF020PagingCollectionView: 0x1238fd000; baseClass = UICollectionView; frame = (0 0; 340 105); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x2838f89f0>; backgroundColor = UIExtendedGrayColorSpace 0 0; layer = <CALayer: 0x2836c2cc0>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}; layout: <_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF012PagingLayout: 0x12268c400>; dataSource: (null)>.
Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0xa248 __exceptionPreprocess
1 libobjc.A.dylib 0x17a68 objc_exception_throw
2 Foundation 0x54681c _userInfoForFileAndLine
3 UIKitCore 0x3ece80 -[UICollectionView _validateScrollingTargetIndexPath:]
4 UIKitCore 0x3ec65c -[UICollectionView _contentOffsetForScrollingToItemAtIndexPath:atScrollPosition:]
5 UIKitCore 0x3ec078 -[UICollectionView _scrollToItemAtIndexPath:atScrollPosition:animated:]
6 SwiftUI 0x9c4e38 OUTLINED_FUNCTION_17
7 SwiftUI 0x9c4f24 OUTLINED_FUNCTION_17
8 SwiftUI 0x2f9dc OUTLINED_FUNCTION_173
9 SwiftUI 0x2e9e8 OUTLINED_FUNCTION_504
10 UIKitCore 0x4cec -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
11 QuartzCore 0xa4e8 CA::Layer::layout_if_needed(CA::Transaction*)
12 QuartzCore 0x1db9c CA::Layer::layout_and_display_if_needed(CA::Transaction*)
13 QuartzCore 0x2f098 CA::Context::commit_transaction(CA::Transaction*, double, double*)
14 QuartzCore 0x663c4 CA::Transaction::commit()
15 UIKitCore 0x49431c __34-[UIApplication _firstCommitBlock]_block_invoke_2
16 CoreFoundation 0x43924 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__
17 CoreFoundation 0xac0ac __CFRunLoopDoBlocks
18 CoreFoundation 0x7becc __CFRunLoopRun
19 CoreFoundation 0x811e4 CFRunLoopRunSpecific
20 GraphicsServices 0x1368 GSEventRunModal
21 UIKitCore 0x3a2d88 -[UIApplication _run]
22 UIKitCore 0x3a29ec UIApplicationMain
23 MySwiftUIApp 0xf0e4 main + 14 (main.m:14)
24 ??? 0x1ca3d1948 (Missing)
唯一提到 MySwiftUIApp 的是 main + 14 (main.m:14) 行(信息不多)。
但对我来说更奇怪的是,问题似乎发生在 UICollectionView 中,但我的应用程序中没有任何 UICollectionView!
所有这些都从 UIKit 应用程序中删除并替换为 List swiftUI 视图。 这些列表可以在低级别调用 UIKit UICollectionView 吗?我不这么认为...
我正在考虑将 crashlytics 日志添加到我的应用程序中的每个列表中,以查看发生了什么情况,以防再次发生崩溃,但我不确定这是否是一个好主意。
最后一件事:这些错误在同一用户身上发生了 3 次,崩溃时间分别是 2023 年 9 月 19 日上午 9:01:41、2023 年 9 月 19 日上午 9:01:43 和 2023 年 9 月 19 日,上午 9:01:45。这怎么可能?怎么可能3秒内发生3次崩溃?这是 Crashlytics 的“问题”吗?
我想添加一些代码,但我不知道哪个类、视图或文件崩溃了。
任何线索将不胜感激!
嗯,多亏了 dalton_c 评论,我已经成功获得了堆栈跟踪,其中包含有关 SwiftUI 步骤的清晰消息:
Last Exception Backtrace:
0 CoreFoundation 0x1aa82e248 __exceptionPreprocess + 164 (NSException.m:202)
1 libobjc.A.dylib 0x1a3bf3a68 objc_exception_throw + 60 (objc-exception.mm:356)
2 Foundation 0x1a51b281c -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 188 (NSException.m:242)
3 UIKitCore 0x1acd9ee80 -[UICollectionView _validateScrollingTargetIndexPath:] + 412 (UICollectionView.m:0)
4 UIKitCore 0x1acd9e65c -[UICollectionView _contentOffsetForScrollingToItemAtIndexPath:atScrollPosition:] + 52 (UICollectionView.m:7348)
5 UIKitCore 0x1acd9e078 -[UICollectionView _scrollToItemAtIndexPath:atScrollPosition:animated:] + 240 (UICollectionView.m:7563)
6 SwiftUI 0x1aeb3de38 PagingCollectionView.scrollToItem(at:at:animated:) + 320 (PageView_PhoneTV.swift:607)
7 SwiftUI 0x1aeb3df24 @objc PagingCollectionView.scrollToItem(at:at:animated:) + 208 (<compiler-generated>:0)
8 SwiftUI 0x1ae1a89dc PagingCollectionView.layoutSubviews() + 988 (PageView_PhoneTV.swift:595)
9 SwiftUI 0x1ae1a79e8 @objc PagingCollectionView.layoutSubviews() + 36 (<compiler-generated>:0)
10 UIKitCore 0x1ac9b6cec -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1980 (UIView.m:18550)
11 QuartzCore 0x1abe934e8 CA::Layer::layout_if_needed(CA::Transaction*) + 500 (CALayer.mm:10223)
12 QuartzCore 0x1abea6b9c CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 148 (CALayer.mm:2516)
13 QuartzCore 0x1abeb8098 CA::Context::commit_transaction(CA::Transaction*, double, double*) + 456 (CAContextInternal.mm:2711)
14 QuartzCore 0x1abeef3c4 CA::Transaction::commit() + 652 (CATransactionInternal.mm:431)
15 UIKitCore 0x1ace4631c __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 36 (UIApplication.m:12109)
16 CoreFoundation 0x1aa867924 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28 (CFRunLoop.c:1822)
17 CoreFoundation 0x1aa8d00ac __CFRunLoopDoBlocks + 368 (CFRunLoop.c:1864)
18 CoreFoundation 0x1aa89fecc __CFRunLoopRun + 856 (CFRunLoop.c:2972)
19 CoreFoundation 0x1aa8a51e4 CFRunLoopRunSpecific + 612 (CFRunLoop.c:3390)
20 GraphicsServices 0x1e36c5368 GSEventRunModal + 164 (GSEvent.c:2196)
21 UIKitCore 0x1acd54d88 -[UIApplication _run] + 888 (UIApplication.m:3726)
22 UIKitCore 0x1acd549ec UIApplicationMain + 340 (UIApplication.m:5316)
23 MySwiftUIApp 0x100feb0e4 main + 80 (main.m:14)
24 dyld 0x1c8bc9948 start + 2504 (dyldMain.cpp:1168)
我在 StackOverflow 中进行了与第 8 行相关的新搜索:“PageView_PhoneTV”。
我发现了这个:
如何修复由 UICollectionView _validateScrollingTargetIndexPath 引起的 SwiftUI 崩溃?
还有这个:
考虑到用户使用的是iOS 16.0,这似乎回答了我的问题,并且与我的TabView有关,并且这是iOS 16.0的错误。