今天在使用UISearchDisplayController和UISearchBar时,出现了无法进入全屏搜索模式等问题,折腾了很长一段时间才解决掉。在这里把心得分享给大家,希望能对大家有帮助。
首先需要明确的是,如果不需要使用全屏模式搜索模式的话,用UISearchBar就够了,直接初始化加入controller中即可。但是我们在实践中常常需要使用到全屏搜索。全屏搜索的代码在网上一搜可以搜到很多,所以在这里只对容易出错的问题进行说明。
1.如果开启了ARC模式,必须用成员变量初始化UISearchDisplayController,否则无法使用self.searchDisplayController访问刚刚创建的UISearchDisplayController。虽然在创建UISearchDisplayController时已经将self的指针传给了UISearchDisplayController,但是系统并没有将其retain,所以一旦超出了局部变量的作用域,self.searchDisplayController就会被置空。具体原因可以看看arc中对于weak指针的描述。
2.如果要进入全屏搜索模式,需要设置UISearchBar的delegate,并实现searchBarShouldBeginEditing方法。在中间执行:
[self.searchDisplayController setActive:YES animated:YES];
3.以下三行代码的delegate不一定要设置成self,设置成别的viewcontroller也行,有利于代码分离,更清晰。
[self.searchDisplayController setDelegate:self];
[self.searchDisplayController setSearchResultsDataSource:self];
[self.searchDisplayController setSearchResultsDelegate:self];
4.在UISearchDisplayControllerDelegate中实现的两个方法:
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
return YES;
}
第一个方法是在搜索内容改变时调用,第二个方法是在搜索范围改变时调用。搜索范围见下图中的All, Device, Desktop, Portable。这些按钮可以在searchBar的scopeButtonTitles中设置。