UitableView在iOS8.4(Xcode 6.4)上工作正常但在iOS9.1(Xcode 7.1.1)上崩溃

问题描述 投票:0回答:2

当我尝试通过Xcode6.4使用它时,UITableView工作正常,但是当我通过Xcode 7.1.1尝试它时它会崩溃。我想这是因为iOS版本。我正在附加崩溃日志。请建议解决问题的最佳方法是什么。我很确定:1)数据源和代表工作正常。 2)Numberofrows和heightOfRow方法也被调用,但它在调用cellForRowAtIndexPath之前崩溃。

这是日志:

2016-02-05 15:34:27.400 Autograph24 [3720:87023] *断言失败 - [UITableViewRowData _assertValidIndexPath:allowEmptySection:],/ BuildRoot / Library / People / com.apple.xbs / Source / UIKit_Sim / UIKit-3512.29。 5 / UITableViewRowData.m:2310 2016-02-05 15:34:27.506 Autograph24 [3720:87023] *由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效的indexPath'***第一次抛出调用堆栈:(0 CoreFoundation 0x00000001075c9f45 exceptionPreprocess + 165 1 libobjc.A.dylib 0x0000000107956deb objc_exception_throw + 48 2 CoreFoundation 0x00000001075c9daa + [NSException raise:format:arguments:] + 106 3 基金会0x0000000106e9b5ee - [NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198 4 UIKit的0x0000000108d11412 - [UITableViewRowData _assertValidIndexPath:allowEmptySection:] + 963 5的UIKit 0x0000000108d11465 - [UITableViewRowData ensureHeightsFaultedInForIndexPath:availHeight:edgeInset:的scrollPosition:] + 55 6的UIKit 0x0000000108af50c6 - [UITableView的_contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:] + 2510 7的UIKit 0x0000000108af59b9 - [UITableView的scrollToRowAtIndexPath: atScrollPosition:animated:] + 39 8 Autograph24 0x0000000106b1b2ad - [DashboardVC scrollToToday] + 685 9 Autograph24 0x0000000106b20289 - [DashboardVC changeCalendarStyle] + 313 10 Autograph24 0x0000000106b20144 - [DashboardVC resizeScreenForPortrait] + 788 11 Autograph24 0x0000000106b1f6a0 - [DashboardVC rotateScreen] + 176 12 Autograph24 0x0000000106b15e76 - [DashboardVC viewDidLoad] + 166 13 UIKit 0x0000000108b49cc4 - [UIViewController中loadViewIfRequired] + 1198 14的UIKit 0x0000000108b4fc7b - [UIViewController中__viewWillAppear:] + 120 15的UIKit 0x0000000108b7fa37 - [UINavigationController的_startCustomTransition:] + 1203 16的UIKit 0x0000000108b8fcdb - [UINavigationController的_startDeferredTransitionIfNeeded:] + 712 17的UIKit 0x0000000108b90cea - [UINavigationController的__viewWillLayoutSubviews] + 57 18 UIKit 0x0000000108d36c85 - [UILayoutContainerView layoutSubviews] + 248 19 UIKit 0x0000000108a6be40 - [UIView(CALayerDelegate)layoutSublayersOfLayer:] + 710 20 QuartzCore 0x000000010736359a - [CALayer layoutSublayers] + 146 21 QuartzCore 0x0000000107357e70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 22 QuartzCore 0x0000000107357cee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 23 QuartzCore 0x000000010734c475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 24 QuartzCore 0x0000000107379c0a _ZN2CA11Transaction6commitEv + 486 25 QuartzCore 0x000000010737a37c _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 26的CoreFoundation 0x00000001074f5947 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23 27的CoreFoundation 0x00000001074f58b7 __CFRunLoopDoObservers + 391 28的CoreFoundation 0x00000001074eb50b __CFRunLoopRun + 1147 29的CoreFoundation 0x00000001074eae08 CFRunLoopRunSpecific + 488 30 GraphicsServices 0x000000010b1b5ad2 GSEventRunModal + 161 31 UIKit 0x00000001089b730d UIApplicationMain + 171 32 Autograph24 0x0000000106b15d9f main + 111 33 libdyld.dylib 0x000000010aac192d开始+ 1 34 ??? 0x0000000000000001 0x0 + 1)libc ++ abi.dylib:以NSException类型的未捕获异常终止

ios iphone xcode6 xcode7
2个回答
0
投票

您有一个无效的索引路径。这意味着部分或行或两者都不对。如果你有一个包含2个部分和每个部分2行的表,那么indexpath 0-3是无效的,因为0部分不提供第3行。同样,indexpath 2-1也是无效的,因为第2部分不存在(只有0) 1)。

至于如何解决这个问题,首先要仔细检查是否调用了所有必需的方法并正确初始化了数据。然后在你班上撒点断点。主要是您使用任何类型的索引路径,并查看它尝试从数据外部读取的位置。


0
投票

学习阅读崩溃日志。在大多数情况下,当然在这种情况下,它们包含所有相关信息:

2016-02-05 15:34:27.400 Autograph24[3720:87023] * Assertion failure in -[UITableViewRowData _assertValidIndexPath:allowEmptySection:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/UITableViewRowData.m:2310
2016-02-05 15:34:27.506 Autograph24[3720:87023] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid indexPath'

它清楚地说:理由:'无效的indexPath'

所以首先提示:一个无效的索引路径(如果您使用UITableViews,这是众所周知的事情)涉及到。

接下来是发生错误的堆栈跟踪。前几个堆栈位置在Apple的代码中。通常跳过它们。但有时,它们包含有趣的提示。这里有一个功能assertValidIndexPath:allowEmptySection:。这再次表明索引路径是问题。

*** First throw call stack: (
0 CoreFoundation 0x00000001075c9f45 exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000107956deb objc_exception_throw + 48
2 CoreFoundation 0x00000001075c9daa +[NSException raise:format:arguments:] + 106
3 Foundation 0x0000000106e9b5ee -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
4 UIKit 0x0000000108d11412 -[UITableViewRowData _assertValidIndexPath:allowEmptySection:] + 963
5 UIKit 0x0000000108d11465 -[UITableViewRowData ensureHeightsFaultedInForIndexPath:availHeight:edgeInset:scrollPosition:] + 55
6 UIKit 0x0000000108af50c6 -[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:] + 2510
7 UIKit 0x0000000108af59b9 -[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:] + 39

您的代码如下。看看上面和下面的线。它说你的函数[DashboardVC scrollToToday]已经调用函数[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]。这是代码中触发错误的地方。

8 Autograph24 0x0000000106b1b2ad -[DashboardVC scrollToToday] + 685
9 Autograph24 0x0000000106b20289 -[DashboardVC changeCalendarStyle] + 313
10 Autograph24 0x0000000106b20144 -[DashboardVC resizeScreenForPortrait] + 788
11 Autograph24 0x0000000106b1f6a0 -[DashboardVC rotateScreen] + 176
12 Autograph24 0x0000000106b15e76 -[DashboardVC viewDidLoad] + 166

这是下一个有趣的位置。这里Apple的UIKit称你的[DashboardVC viewDidLoad]。所以这给了很多背景。它发生在你在viewDidLoad阶段建造的早期。

13 UIKit 0x0000000108b49cc4 -[UIViewController loadViewIfRequired] + 1198
14 UIKit 0x0000000108b4fc7b -[UIViewController __viewWillAppear:] + 120
15 UIKit 0x0000000108b7fa37 -[UINavigationController _startCustomTransition:] + 1203
16 UIKit 0x0000000108b8fcdb -[UINavigationController _startDeferredTransitionIfNeeded:] + 712
17 UIKit 0x0000000108b90cea -[UINavigationController __viewWillLayoutSubviews] + 57
18 UIKit 0x0000000108d36c85 -[UILayoutContainerView layoutSubviews] + 248
19 UIKit 0x0000000108a6be40 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 710
20 QuartzCore 0x000000010736359a -[CALayer layoutSublayers] + 146
21 QuartzCore 0x0000000107357e70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
22 QuartzCore 0x0000000107357cee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
23 QuartzCore 0x000000010734c475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
24 QuartzCore 0x0000000107379c0a _ZN2CA11Transaction6commitEv + 486
25 QuartzCore 0x000000010737a37c _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
26 CoreFoundation 0x00000001074f5947 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23
27 CoreFoundation 0x00000001074f58b7 __CFRunLoopDoObservers + 391
28 CoreFoundation 0x00000001074eb50b __CFRunLoopRun + 1147
29 CoreFoundation 0x00000001074eae08 CFRunLoopRunSpecific + 488
30 GraphicsServices 0x000000010b1b5ad2 GSEventRunModal + 161
31 UIKit 0x00000001089b730d UIApplicationMain + 171
32 Autograph24 0x0000000106b15d9f main + 111
33 libdyld.dylib 0x000000010aac192d start + 1
34 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib:
terminating with uncaught exception of type NSException

结合这些信息,我会得出结论,你从[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]中调用[DashboardVC viewDidLoad],它必然会失败,因为UITableView在视图控制器生命周期的这个时候没有正确构造。

早期的iOS版本在这里更宽松;但是后来的版本对视图控制器完全构造之前可以做的事情有相当的限制。

你需要将你的[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]调用移动到viewWillAppear:甚至viewDidAppear:

© www.soinside.com 2019 - 2024. All rights reserved.