4

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

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 在生产中报告了此错误,但我们从未能够重现此错误。

这个问题看起来类似于:Selecting cell after search doesn't segue 在视觉上,但会加载下一个视图 Swift Xcode但尚未给出真正的答案。

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

有想法该怎么解决这个吗?

谢谢

4

3 回答 3

3

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

问题是 Searchbarcontroller 仍然持有 ViewController 的引用(委托)。

因此,您所要做的就是在查看 dealloc 或消失时手动删除引用

像这样的东西:

- (void)dealloc {
    self.searchController.searchResultsUpdater = nil;
    self.searchController.searchBar.delegate = nil;
    self.searchController.delegate = nil;
    self.searchController = nil;
}
于 2016-05-15T16:42:19.727 回答
0

尝试清理所有参考文献,如下所示。

-(void)dealloc{
    if (_searchController) {
        _searchController.searchResultsUpdater = nil;
        _searchController.searchBar.delegate = nil;
        _searchController.delegate = nil;
    }
}
于 2016-08-10T06:20:58.843 回答
0

使用 UISearchContainerViewController 作为 Main ViewController 并将 SearchController 包装在其中。

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

尽管您可以以模态方式呈现搜索控制器对象,但您永远不应该将一个对象推送到导航控制器的堆栈上,或者将一个对象用作另一个容器视图控制器的子对象。相反,嵌入这个类的一个实例,让它管理搜索控制器内容的呈现。

https://developer.apple.com/documentation/uikit/uisearchcontainerviewcontroller

于 2019-10-08T15:17:22.133 回答