有一个奇怪的崩溃,只发生在iOS 16。当我尝试创建一个页面样式的TabView
时,当数组为空时,它会崩溃。但它在iOS 15中运行得非常好。这是iOS 16的bug吗?
Xcode版本:版本14.0(14A309)
iOS版本:16.0和16.1测试版
struct TestView: View {
@State private var data: [Int] = []
var body: some View {
TabView {
ForEach(0..<data.count, id: \.self) { index in
RoundedRectangle(cornerRadius: 12)
}
}
.frame(height: 200)
.tabViewStyle(.page(indexDisplayMode: .never))
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.data = [1,2,3,4]
}
}
}
}
崩溃日志
2022-10-04 18:01:56.275879+0300 TestFirebaseCrash[24331:486169] *** Assertion failure in -[_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF020PagingCollectionView _validateScrollingTargetIndexPath:], UICollectionView.m:7339
2022-10-04 18:01:56.278900+0300 TestFirebaseCrash[24331:486169] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '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: 0x140841e00; baseClass = UICollectionView; frame = (0 0; 428 200); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600001d8d260>; backgroundColor = UIExtendedGrayColorSpace 0 0; layer = <CALayer: 0x600001386d20>; contentOffset: {0, 0}; contentSize: {0, 200}; adjustedContentInset: {0, 0, 0, 0}; layout: <_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF012PagingLayout: 0x140514090>; dataSource: <_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF011Coordinator: 0x6000021f46c0>>.'
*** First throw call stack:
(
0 CoreFoundation 0x000000018040c304 __exceptionPreprocess + 172
1 libobjc.A.dylib 0x000000018005131c objc_exception_throw + 56
2 Foundation 0x0000000180b11f88 _userInfoForFileAndLine + 0
3 UIKitCore 0x00000001032279a8 -[UICollectionView _validateScrollingTargetIndexPath:] + 408
4 UIKitCore 0x0000000103227cc0 -[UICollectionView _contentOffsetForScrollingToItemAtIndexPath:atScrollPosition:] + 48
5 UIKitCore 0x0000000103228838 -[UICollectionView _scrollToItemAtIndexPath:atScrollPosition:animated:] + 220
6 SwiftUI 0x0000000106f5de08 OUTLINED_FUNCTION_15 + 18076
7 SwiftUI 0x0000000106f5dea8 OUTLINED_FUNCTION_15 + 18236
8 SwiftUI 0x0000000106f5dc88 OUTLINED_FUNCTION_15 + 17692
9 SwiftUI 0x0000000106f5dcf4 OUTLINED_FUNCTION_15 + 17800
10 UIKitCore 0x0000000103ea214c -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1920
11 QuartzCore 0x0000000187ed749c _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 440
12 QuartzCore 0x0000000187ee1f54 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 128
13 QuartzCore 0x0000000187e117d0 _ZN2CA7Context18commit_transactionEPNS_11TransactionEdPd + 452
14 QuartzCore 0x0000000187e3d47c _ZN2CA11Transaction6commitEv + 652
15 UIKitCore 0x0000000103a257f0 __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 32
16 CoreFoundation 0x0000000180370e38 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20
17 CoreFoundation 0x0000000180370580 __CFRunLoopDoBlocks + 364
18 CoreFoundation 0x000000018036ae7c __CFRunLoopRun + 776
19 CoreFoundation 0x000000018036a75c CFRunLoopRunSpecific + 584
20 GraphicsServices 0x0000000188f60c98 GSEventRunModal + 160
21 UIKitCore 0x0000000103a0cb74 -[UIApplication _run] + 868
22 UIKitCore 0x0000000103a10b1c UIApplicationMain + 124
23 SwiftUI 0x0000000107702130 OUTLINED_FUNCTION_51 + 496
24 SwiftUI 0x0000000107701fd8 OUTLINED_FUNCTION_51 + 152
25 SwiftUI 0x0000000106ee5894 OUTLINED_FUNCTION_10 + 88
26 TestFirebaseCrash 0x000000010269ec6c $s17TestFirebaseCrash0abC3AppV5$mainyyFZ + 40
27 TestFirebaseCrash 0x000000010269ed14 main + 12
28 dyld 0x00000001028e9fa0 start_sim + 20
29 ??? 0x00000001029bd08c 0x0 + 4338733196
30 ??? 0x1a00000000000000 0x0 + 1873497444986126336
)
libc++abi: terminating with uncaught exception of type NSException
terminating with uncaught exception of type NSException
CoreSimulator 857.10 - Device: iPhone 13 Pro Max (29ECC9E3-B223-4591-A18A-1C858F528C45) - Runtime: iOS 16.0 (20A360) - DeviceType: iPhone 13 Pro Max
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '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: 0x140841e00; baseClass = UICollectionView; frame = (0 0; 428 200); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600001d8d260>; backgroundColor = UIExtendedGrayColorSpace 0 0; layer = <CALayer: 0x600001386d20>; contentOffset: {0, 0}; contentSize: {0, 200}; adjustedContentInset: {0, 0, 0, 0}; layout: <_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF012PagingLayout: 0x140514090>; dataSource: <_TtC7SwiftUIP33_8825076C2763A50452A210CBE1FA4AF011Coordinator: 0x6000021f46c0>>.'
(lldb)
3条答案
按热度按时间guz6ccqo1#
它看起来像是固定在iOS
16.1 Beta 4
hmae6n7t2#
如果
data
为空,尝试返回Text("")
(基本上是一个空视图)。vdzxcuhz3#
谢谢你的提问和Tamas的回答。但塔马斯的回答对我不起作用。在iOS 15.X中,TabView始终为Text(“”)。
我解决了这个代码。