2016-02-05 63 views
0

当我试图通过Xcode6.4使用它时,UITableView工作的很好,但是当我试着通过Xcode 7.1.1崩溃。我想这是因为iOS版本。我附上了崩溃日志。请提出解决问题的最佳方法。我很肯定: 1)数据源和代表工作正常。 2)Numberofrows和heightOfRow方法也被调用,但它在cellForRowAtIndexPath被调用之前崩溃。UitableView在iOS8.4(Xcode 6.4)上正常工作,但在iOS9.1上崩溃(Xcode 7.1.1)

这里是日志:

2016年2月5日15:34:27.400 Autograph24 [3720:87023] *断言故障 在 - [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] *终止应用程序 由于未捕获异常'NSInternalInconsistencyException',原因: 'IndexPath'无效 ***第一次抛出调用堆栈:(0 CoreFo undation 0x00000001075c9f45 exceptionPreprocess + 165 1 libobjc.A。dylib
0x0000000107956deb objc_exception_throw + 48 2的CoreFoundation
0x00000001075c9daa + [NSException提高:格式:参数:] + 106 3
基金会0x0000000106e9b5ee - [NSAssertionHandler handleFailureInMethod:对象:文件:LINENUMBER:描述:] + 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 0X 0000000108af59b9 - [UITableView的scrollToRowAtIndexPath:atScrollPosition:动画:] + 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 - [ ü INavigationController _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主+ 111 33 libdyld.dylib
0x000000010aac192d启动+ 1 34 ???
0x0000000000000001为0x0 + 1)的libC++ abi.dylib:与类型NSException

+0

是否设置了numberOfSection和viewForHeader? –

+0

它已经在崩溃日志中声明: - 由于未捕获的异常'NSInternalInconsistencyException',原因:'无效的indexPath'终止应用程序。 – Vizllx

回答

0

您有一个无效indexpath的 未捕获的异常终止。这意味着部分或行或两者都不正确。如果你有一个包含2部分和每部分2行的表,那么索引路径0-3是无效的,因为部分0不提供第3行。同样,索引路径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 

这是下一个有趣的位置。这里苹果的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 

结合这个信息,我可以得出结论,你[DashboardVC viewDidLoad],这势必内调用[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]失败,任何索引路径,因为UITableView没有正确此时视图控制器生命周期的构建。

早期的iOS版本在这里比较宽松;但后来的版本对视图控制器完全构建之前可以执行的操作有相当的限制。

您需要将[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]电话转至viewWillAppear:甚至viewDidAppear: