随机UISearchDisplayController崩溃(iOS 7)

我一直在试图解决大约50%的用户遇到的崩溃问题。 在我实现了一个UISearchDisplayController(也就是将一个search栏添加到一个表视图)后,崩溃开始了,但是我还没有能够重现崩溃,甚至没有一次。 根据我的用户,当他们打开具有UISearchDisplayController的表格视图时,他们立即崩溃(或冻结)。

根据Crashlytics,崩溃发生在:

-[UISearchDisplayController _updateTableHeaderBackgroundViewInTableView:amountScrolledUnder:] 

我以编程方式创build了UITableView,但我主要通过IB添加了UISearchBar / UISearchDisplayController。

关于崩溃似乎指的“表格背景视图”,我之前做了两件事情。 首先,我将表视图背景视图设置为零:

 [self.tableView setBackgroundView:nil]; 

其次,我也是这样做的:

 - (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section { if (aTableView != nil && self.searchDisplayController != nil) { if (self.searchDisplayController.isActive) { return nil; } else { return [super sectionAtIndex:section].headerTitle; } } else { return [super sectionAtIndex:section].headerTitle; } } 

从那时起,我将背景视图更改为一个__strong UIView,框架大小为CGZero,这意味着我刚刚为背景添加了一个强大的空视图。 另外,在第二段代码中,不是返回nil,而是返回一个空string@“”。

我还没有把这些变化推给我的用户,因为在我这样做之前我想确定一下。 试图谷歌的UISearchDisplayControllerfunction,但没有真正find任何东西,所以我猜这是一个iOS 7的具体问题,这使得更难以追查,特别是因为我不能再现它。

无论如何,我希望有人要么自己经历过这样的问题,要么有人对可能造成这种情况的某种想法有所了解。

更新 :这是完整的崩溃。

 Thread : Crashed: com.apple.main-thread 0 libobjc.A.dylib 0x0000000191f179d0 objc_msgSend + 16 1 UIKit 0x0000000188f63820 -[UISearchDisplayController _updateTableHeaderBackgroundViewInTableView:amountScrolledUnder:] + 164 2 UIKit 0x0000000188f63394 -[UISearchBar _didMoveFromWindow:toWindow:] + 312 3 UIKit 0x0000000188e6e42c -[UIView(Internal) _didMoveFromWindow:toWindow:] + 684 4 UIKit 0x0000000188e9280c -[UIScrollView _didMoveFromWindow:toWindow:] + 68 5 UIKit 0x0000000188e6dba0 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 148 6 UIKit 0x0000000188e6d998 -[UIView(Hierarchy) _postMovedFromSuperview:] + 292 7 UIKit 0x0000000188e7c4ec -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1628 8 UIKit 0x000000018906af44 -[_UIParallaxDimmingView didMoveToWindow] + 144 9 UIKit 0x0000000188e6e768 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 1512 10 UIKit 0x0000000188e6e42c -[UIView(Internal) _didMoveFromWindow:toWindow:] + 684 11 UIKit 0x0000000188e6dba0 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 148 12 UIKit 0x0000000188e6d998 -[UIView(Hierarchy) _postMovedFromSuperview:] + 292 13 UIKit 0x0000000188e7c4ec -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1628 14 UIKit 0x000000018906a67c __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke + 1636 15 UIKit 0x0000000188e82bb8 +[UIView(Animation) performWithoutAnimation:] + 88 16 UIKit 0x0000000189069d54 -[_UINavigationParallaxTransition animateTransition:] + 828 17 UIKit 0x0000000189022078 -[UINavigationController _startCustomTransition:] + 2724 18 UIKit 0x0000000188f2c794 -[UINavigationController _startDeferredTransitionIfNeeded:] + 464 19 UIKit 0x0000000188f2c564 -[UINavigationController __viewWillLayoutSubviews] + 56 20 UIKit 0x0000000188f2c4e4 -[UILayoutContainerView layoutSubviews] + 200 21 UIKit 0x0000000188e6ed78 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 348 22 QuartzCore 0x0000000188a6b0cc -[CALayer layoutSublayers] + 184 23 QuartzCore 0x0000000188a65c94 CA::Layer::layout_if_needed(CA::Transaction*) + 300 24 QuartzCore 0x0000000188a65b4c CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32 25 QuartzCore 0x0000000188a653d4 CA::Context::commit_transaction(CA::Transaction*) + 280 26 QuartzCore 0x0000000188a65178 CA::Transaction::commit() + 424 27 QuartzCore 0x0000000188a5ea30 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 80 28 CoreFoundation 0x0000000185f5f7e0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32 29 CoreFoundation 0x0000000185f5ca68 __CFRunLoopDoObservers + 372 30 CoreFoundation 0x0000000185f5cdf4 __CFRunLoopRun + 764 31 CoreFoundation 0x0000000185e9db38 CFRunLoopRunSpecific + 452 32 GraphicsServices 0x000000018b8c3830 GSEventRunModal + 168 33 UIKit 0x0000000188edc0e8 UIApplicationMain + 1156 34 Flash Reader 0x00000001000904dc main + 17 (main.m:17) 35 libdyld.dylib 0x0000000192507aa0 start + 4 

更新2 :这似乎是只发生在iPhone 5S,这也将解释为什么我无法重现这一点。 我有一种感觉,它与这个代码块有关:

 CGRect newBounds = self.tableView.bounds; if (self.tableView.bounds.origin.y < 44) { newBounds.origin.y = newBounds.origin.y + self.searchDisplayController.searchBar.bounds.size.height; self.tableView.bounds = newBounds; } // new for iOS 7 if (self.tableView != nil && self.staticContentSections.count > 0) { [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:0 animated:YES]; } 

我希望这是导致崩溃的原因,因为如果是这样,我希望通过在viewWillAppear中做这个来解决这个问题:

 self.edgesForExtendedLayout = UIRectEdgeNone; self.tableView.contentOffset = CGPointMake(0, 44); 

更新3 :那么,这并没有解决它。 这种情况仍然在发生,无论是随机的还是每次用户使用iPhone 5S时。 在5S模拟器中不会发生这种情况,但是我不能进一步debugging,因为我没有5S。 我开始认为这是一个iOS 7的错误,而不是应用程序本身的错误。

我得到了iOS 8.0的崩溃。 我通过在视图控制器的dealloc(deinit)中设置searchBar.delegate = nil来修复它。