为啥我的 UISearchController 委托方法没有被调用?

Posted

技术标签:

【中文标题】为啥我的 UISearchController 委托方法没有被调用?【英文标题】:Why are my UISearchController delegate methods not being called?为什么我的 UISearchController 委托方法没有被调用? 【发布时间】:2018-05-06 19:15:28 【问题描述】:

我在课堂上加入了以下内容:

@interface DiscoverNew() <UISearchResultsUpdating, UISearchBarDelegate, UISearchControllerDelegate>

我在这里设置了UISearchController

-(void)viewDidLoad 

       [self configureSearchController];

  

-(void)configureSearchController

        // Initialize and perform a minimum configuration to the search controller.
        UISearchController *searchController = self.searchController;
        searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        searchController.searchResultsUpdater = self;
        searchController.dimsBackgroundDuringPresentation = NO;
        searchController.searchBar.placeholder = @"Search for friends...";
        searchController.delegate = self;
        searchController.searchBar.delegate = self;
        [searchController.searchBar sizeToFit];

        [searchController.searchBar setBarStyle:UIBarStyleBlack];
        [searchController.searchBar setSearchBarStyle:UISearchBarStyleMinimal];
        searchController.searchBar.tintColor = [GBColor accentGray];
        searchController.searchBar.backgroundColor = [GBColor darkGray];
        searchController.searchBar.barTintColor = [GBColor accentGray];
        searchController.searchBar.searchTextPositionAdjustment = UIOffsetMake(18.0f, 0.0f);

        // Place searchbar above TableView
        self.tableView.tableHeaderView = searchController.searchBar;


如您所见,我调用了searchController.searchBar.delegate = self; searchController 确实出现在它应该出现的位置,并且在点击搜索栏时会显示键盘,但没有调用我的委托方法。怎么回事?

【问题讨论】:

可能是因为您的searchController 是一个没有强引用的局部变量。在configureSearchController 结束时,您创建的UISearchController 将被释放。 @maddy,我该如何解决?不熟悉强/弱引用及其作用。 使searchController 成为实例变量而不是局部变量。 @maddy 我的 .h 文件中确实有 @property (nonatomic, strong) UISearchController *searchController; 你能实现搜索栏委托方法吗? 【参考方案1】:

您有一个名为searchController 的属性。但随后您在 configureSearchController 方法中创建了一个同名的局部变量。所以最后你永远不会设置 searchController 属性。结果,您在本地创建的搜索控制器超出范围,没有更多引用,并被释放。

解决方法是稍微更新您的代码。

UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
searchController.searchResultsUpdater = self;
searchController.dimsBackgroundDuringPresentation = NO;
searchController.searchBar.placeholder = @"Search for friends...";
searchController.delegate = self;
searchController.searchBar.delegate = self;
[searchController.searchBar sizeToFit];

[searchController.searchBar setBarStyle:UIBarStyleBlack];
[searchController.searchBar setSearchBarStyle:UISearchBarStyleMinimal];
searchController.searchBar.tintColor = [GBColor accentGray];
searchController.searchBar.backgroundColor = [GBColor darkGray];
searchController.searchBar.barTintColor = [GBColor accentGray];
searchController.searchBar.searchTextPositionAdjustment = UIOffsetMake(18.0f, 0.0f);

self.searchController = searchController;

【讨论】:

工作完美。你的解释帮助我理解了我哪里出错了。谢谢。

以上是关于为啥我的 UISearchController 委托方法没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UISearchController 委托方法没有被调用?

为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?

为啥 iOS viewPager 与 UISearchController 崩溃?

为啥在 UISearchBar 上输入时 UISearchController 会消失?

为啥我的 UIView 不显示 UISearchBar

为啥我的 tableView 变量返回 nil?