Random UISearchDisplayController Crash (iOS 7)

倾然丶 夕夏残阳落幕 提交于 2019-12-06 08:31:34

问题


I've been trying to fix a crash that around 50% of my users are having. The crash began after I implemented a UISearchDisplayController (ie. added a search bar to a table view), but I haven't been able to reproduce the crash, not even once. According to my users, they instantly crash (or freeze) when they open the table view that has the UISearchDisplayController.

According to Crashlytics, the crash is happening at:

-[UISearchDisplayController _updateTableHeaderBackgroundViewInTableView:amountScrolledUnder:]

I've created the UITableView programmatically, but I've added the UISearchBar/UISearchDisplayController mostly via IB.

Regarding the "table header background view" that the crash seems to be referring to, I was doing two things previously. Firstly, I was setting the table views background view to nil:

[self.tableView setBackgroundView:nil];

Secondly, I was also doing this:

- (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;
    }
}

I've since then change the background view to a __strong UIView with a frame size of CGZero, meaning I've just added a strong, empty view to the background. Additionally, in the second piece of code, instead of returning nil, I'm now returning an empty string, @"".

I haven't pushed these changes to my users yet, because I want to be sure before I do so. Tried to google the UISearchDisplayController function but didn't really find anything, so I'm guessing it's an iOS 7-specific issue, which makes it even harder to track down, especially since I can't reproduce it.

Anyway, I'm hoping that someone has either experienced this kind of problem themselves, or that someone has some sort of idea on what could be causing this.

UPDATE: Here's the full crash.

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

UPDATE 2: It seems like this is only happening on an iPhone 5S and that would also explain why I'm unable to reproduce this. I have a feeling that it's related to this block of code:

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];
    }

I'm hoping that this is what causes the crash, because if so, I'm hoping to fix this by just doing this in viewWillAppear:

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

UPDATE 3: Well, that didn't fix it. This is still happening, either randomly or each time when the user has an iPhone 5S. It doesn't happen in the 5S simulator, but I can't debug it any further since I don't own a 5S. I'm starting to think that this is an iOS 7 bug, not a bug with the app itself.


回答1:


I got the crash in iOS 8.0. I fixed it by setting searchBar.delegate = nil in dealloc (deinit) of the view controller.



来源:https://stackoverflow.com/questions/21237571/random-uisearchdisplaycontroller-crash-ios-7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!