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

时间:2016-02-05 10:19:40

标签: ios iphone xcode6 xcode7

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

这是日志:

  

2016-02-05 15:34:27.400 Autograph24 [3720:87023] *断言失败   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] * 终止应用   由于未被捕获的异常' 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图形服务
  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:终止于   NSException类型的未捕获异常

2 个答案:

答案 0 :(得分:0)

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

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

答案 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: