Ios 使用UISearchController取消搜索会导致崩溃

Ios 使用UISearchController取消搜索会导致崩溃,ios,objective-c,uisearchbar,uisearchcontroller,ios9.3,Ios,Objective C,Uisearchbar,Uisearchcontroller,Ios9.3,在我们的应用程序中,我们有一个UITableViewController,它有一个UISearchController: searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.searchController.searchResultsUpdater = self; [self.searchController.searchBar sizeToFit]; self.ta

在我们的应用程序中,我们有一个UITableViewController,它有一个UISearchController:

searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
[self.searchController.searchBar sizeToFit];

self.tableView.tableHeaderView = self.searchController.searchBar;
self.showFooterView = YES;

self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self;
self.definesPresentationContext = YES;
表视图控制器也是一个UISearchBarDelegate 和UISearchControllerDelegate

#pragma mark - UISearchBarDelegate
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [searchBar resignFirstResponder];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    self.contacts = self.allContacts;
    [self.tableView reloadData];
}
现在一切正常,但有时用户启动搜索,在搜索栏中键入几个字符,返回结果,然后用户取消搜索,然后发生以下情况:

Fatal Exception: NSInvalidArgumentException
-[_UIFullscreenPresentationController adaptivePresentationController]: unrecognized selector sent to instance 0x147c81ce0

Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x1842b4f48 __exceptionPreprocess
1  libobjc.A.dylib                0x198d77f80 objc_exception_throw
2  CoreFoundation                 0x1842bbc5c __methodDescriptionForSelector
3  CoreFoundation                 0x1842b8c00 ___forwarding___
4  CoreFoundation                 0x1841bccac _CF_forwarding_prep_0
5  UIKit                          0x18a1ba084 -[UISearchController _searchPresentationController]
6  UIKit                          0x189e7d10c -[_UISearchControllerTransplantSearchBarAnimator animateTransition:]
7  UIKit                          0x189b9fa90 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke
8  UIKit                          0x189af856c _runAfterCACommitDeferredBlocks
9  UIKit                          0x189b054bc _cleanUpAfterCAFlushAndRunDeferredBlocks
10 UIKit                          0x189839984 _afterCACommitHandler
11 CoreFoundation                 0x18426bbd0 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
12 CoreFoundation                 0x184269974 __CFRunLoopDoObservers
13 CoreFoundation                 0x184269da4 __CFRunLoopRun
14 CoreFoundation                 0x184198ca0 CFRunLoopRunSpecific
15 GraphicsServices               0x18f3d4088 GSEventRunModal
16 UIKit                          0x1898b0ffc UIApplicationMain
尽管Fabric在生产过程中报告了此错误,但我们始终无法重现此错误

这个问题看起来与此类似:但还没有给出真正的答案

我已经开始研究演示控制器,但我们没有需要以特定方式设置演示控制器的特殊功能

有没有办法解决这个问题


谢谢

我在Swift上也遇到了同样的问题

问题是Searchbarcontroller仍然保留ViewController的引用(委托)

因此,当视图解除锁定或消失时,您所要做的就是手动删除引用

大概是这样的:

- (void)dealloc {
    self.searchController.searchResultsUpdater = nil;
    self.searchController.searchBar.delegate = nil;
    self.searchController.delegate = nil;
    self.searchController = nil;
}

尝试清理所有参考资料,如下所示

-(void)dealloc{
    if (_searchController) {
        _searchController.searchResultsUpdater = nil;
        _searchController.searchBar.delegate = nil;
        _searchController.delegate = nil;
    }
}

使用UISearchContainerServiceController作为主视图控制器,并将SearchController包装在其中

管理界面中搜索结果显示的视图控制器

尽管可以以模式显示搜索控制器对象,但决不应将其推送到导航控制器的堆栈上,或将其用作另一个容器视图控制器的子对象。相反,嵌入此类的实例并让它管理搜索控制器内容的表示


你找到答案了吗。或者你仍然面临着这个问题。确保您的代码级别存在此问题。您正在尝试访问,但这不在内存中不需要进行_searchController检查,因为其他代码都在nil上运行,您也不需要引用ivar,但可以安全地使用self.getter