UITableView 导致 iOS7 崩溃?

Posted

技术标签:

【中文标题】UITableView 导致 iOS7 崩溃?【英文标题】:UITableView causing crash on iOS7? 【发布时间】:2015-07-12 01:44:21 【问题描述】:

这个崩溃是由崩溃报告工具报告的,它只发生在 ios7 上,我无法重现。

似乎有东西调用scrollView:contentSizeForZoomScale:withProposedSize,单元格包含 2 个按钮,这些按钮根据传递给它的数据调整大小(没有滚动视图,也没有设置任何 UIScrollView 的委托)。

对导致在单元格上调用 scrollView 委托方法的原因有什么想法吗?

Fatal Exception: NSInvalidArgumentException
-[ProfileContactUserCell scrollView:contentSizeForZoomScale:withProposedSize:]: unrecognized selector sent to instance 0x127592a20

Thread : Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x000000018169b100 __exceptionPreprocess
1  libobjc.A.dylib                0x000000018dba41fc objc_exception_throw
2  CoreFoundation                 0x000000018169fdb4 __methodDescriptionForSelector
3  CoreFoundation                 0x000000018169dae0 ___forwarding___
4  CoreFoundation                 0x00000001815bd78c _CF_forwarding_prep_0
5  UIKit                          0x0000000184680d38 -[UIScrollView setFrame:]
6  UIKit                          0x000000018467b12c -[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:]
7  UIKit                          0x000000018476ad20 -[UIScrollView _resizeWithOldSuperviewSize:]
8  CoreFoundation                 0x00000001815ad1dc __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke
9  CoreFoundation                 0x00000001815ad0a8 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:]
10 UIKit                          0x000000018466a9f8 -[UIView(Geometry) resizeSubviewsWithOldSize:]
11 UIKit                          0x000000018465b9f8 -[UIView(Geometry) setFrame:]
12 UIKit                          0x00000001847400d8 -[UITableViewCell setFrame:]
13 UIKit                          0x00000001847adf74 __53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke
14 UIKit                          0x0000000184672de0 +[UIView(Animation) performWithoutAnimation:]
15 UIKit                          0x00000001847adcc8 -[UITableView _configureCellForDisplay:forIndexPath:]
16 UIKit                          0x00000001847ac90c -[UITableView _createPreparedCellForGlobalRow:withIndexPath:]
17 UIKit                          0x000000018474ae4c -[UITableView _updateVisibleCellsNow:]
18 UIKit                          0x000000018473d8a4 -[UITableView _visibleCells]
19 UIKit                          0x000000018473d768 -[UITableView setSeparatorStyle:]
20 Company                   0x00000001000ae7ac -[ProfileViewController viewDidLoad] (ProfileViewController.m:104)
21 UIKit                          0x0000000184664658 -[UIViewController loadViewIfRequired]
22 UIKit                          0x00000001846643dc -[UIViewController view]
23 UIKit                          0x0000000184811850 -[UINavigationController _startCustomTransition:]
24 UIKit                          0x000000018471bf3c -[UINavigationController _startDeferredTransitionIfNeeded:]
25 UIKit                          0x000000018471bd0c -[UINavigationController __viewWillLayoutSubviews]
26 UIKit                          0x000000018471bc8c -[UILayoutContainerView layoutSubviews]
27 UIKit                          0x000000018465efe0 -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
28 QuartzCore                     0x0000000184250258 -[CALayer layoutSublayers]
29 QuartzCore                     0x000000018424ae20 CA::Layer::layout_if_needed(CA::Transaction*)
30 QuartzCore                     0x000000018424acd8 CA::Layer::layout_and_display_if_needed(CA::Transaction*)
31 QuartzCore                     0x000000018424a560 CA::Context::commit_transaction(CA::Transaction*)
32 QuartzCore                     0x000000018424a304 CA::Transaction::commit()
33 UIKit                          0x0000000184663154 _UIApplicationHandleEventQueue
34 CoreFoundation                 0x000000018165b7f4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
35 CoreFoundation                 0x000000018165ab50 __CFRunLoopDoSources0
36 CoreFoundation                 0x0000000181658de8 __CFRunLoopRun
37 CoreFoundation                 0x0000000181599dd0 CFRunLoopRunSpecific
38 GraphicsServices               0x0000000187281c0c GSEventRunModal
39 UIKit                          0x00000001846cafc4 UIApplicationMain
40 Company                   0x0000000100072c1c main (main.m:13)
41 libdyld.dylib                  0x000000018e197aa0 start

编辑: 实现了那个方法,看起来它被调用了:

<UITableViewCellScrollView: 0x78e39ee0; frame = (0 0; 320 44); autoresize = W+H; gestureRecognizers = <NSArray: 0x78eafc10>; layer = <CALayer: 0x78e354a0>; contentOffset: 0, 0>

【问题讨论】:

【参考方案1】:

在 iOS7 上,苹果对 UITableViewCell 的视图层次结构进行了更改。 在 iOS 7 中,contntView 嵌入在 UIScrollView 中,并且在某些情况下(我还没有弄清楚何时)的滚动视图会在单元格上调用该方法。

解决方法是实现以下方法并返回 poposedSize。仅在 iOS7 上需要此修复程序。 iOS8+ 上的 viewHierarchy 已更改为 iOS6 上的方式。 (在 tableViewCell 层次结构中不再使用 UIScrollView)

- (CGSize)scrollView:(id)arg1 contentSizeForZoomScale:(float)arg2 withProposedSize:(CGSize)arg3 
    return arg3;

【讨论】:

以上是关于UITableView 导致 iOS7 崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8:UITableView 在 heightForRowAtIndexPath 上崩溃(在 iOS7 上运行良好)

在 UITableView 中使用带有 [UIImage resizableImageWithCapInsets] 的 UIImageView 会导致延迟

动画 UITableView 的自动布局顶部约束导致崩溃,有啥线索吗?

从 UITableView 中删除值会导致崩溃

仅在 iPhone 5C 上滚动 UITableView 会导致异常和崩溃

UITextField限制汉字数量最正确的姿势,解决iOS7下substringToIndex方法导致的崩溃