搜索條是我們經常使用的一個控件;
iOS8之前,使用搜索采用的是:UISearchBar+UIDisplayController;
iOS8之后,采用的是UISearchController,看演示+上代碼:
這里主要介紹簡單創建,基本滿足使用需求。
創建前的準備
需要先明白幾個代理里面必須知道的代理回調
UISearchControllerDelegate
/*search bar 即將出現*/
- (void)willPresentSearchController:(UISearchController*)searchController;
/*search bar 已經出現*/
- (void)didPresentSearchController:(UISearchController*)searchController;
/*search bar 即將消失*/
- (void)willDismissSearchController:(UISearchController*)searchController;
/*search bar 已經消失*/
- (void)didDismissSearchController:(UISearchController*)searchController;
UISearchResultsUpdating
/*搜索條出現、消失、輸入文字、刪除文字時都會觸發,且為必須實現的代理方法,即使你在里面什么都不寫*/
- (void)updateSearchResultsForSearchController:(UISearchController*)searchController;
UISearchBarDelegate
這個代理里面的方法就很多了,而且大都很簡單,在這里我只敘述兩個。
/*點擊取消按鈕觸發*/
- (void)searchBarCancelButtonClicked:(UISearchBar*)searchBar;
/*點擊搜索按鈕觸發*/
- (void)searchBarSearchButtonClicked:(UISearchBar*)searchBar;
開始創建searchController
遵守代理
<UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating>
創建和基本屬性
/*如果不需要指定顯示在哪個控制器,則末尾的參數填寫為nil就好,這樣默認顯示在當前的控制錢*/
self.searchController= [[UISearchController alloc]initWithSearchResultsController:nil];
/*遵守三個代理*/
self.searchController.delegate=self;
self.searchController.searchBar.delegate=self;
self.searchController.searchResultsUpdater=self;
/*提醒字眼*/
self.searchController.searchBar.placeholder=@"請輸入關鍵字搜索";
/*searchController的背景視圖顏色,如果不設置會顯示你在搜索前的數據,是透過來的*/
self.searchController.view.backgroundColor= [UIColor whiteColor];
/*包著搜索框外層的顏色*/
self.searchController.searchBar.barTintColor= [UIColor grayColor];
//搜索時,背景變暗色
/*
self.searchController.dimsBackgroundDuringPresentation = NO;*/
/*搜索時,背景變模糊*/
/*
self.searchController.obscuresBackgroundDuringPresentation = NO;*/
/*點擊搜索的時候,是否隱藏導航欄
如果有特殊需要,可以寫在即將消失、即將出現的代理里面*/
/*
self.searchController.hidesNavigationBarDuringPresentation = NO;*/
/*這句如果不添加可能會導致點擊search的時候search向上移動64,導致不可見,這句話是應用在控制器上面的*/
self.definesPresentationContext = YES;
self.tableHeaderView=self.searchController.searchBar;
如何table view的代理面區分是在搜索情形下還是正常情形下,在創建行數、高度、cell的地方區分就可以了
if(self.searchController.active) {
NSLog(@"搜索");
}else{
NSLog(@"正常table view");
}
回調以下幾個代理,基本就可以了
- (void)updateSearchResultsForSearchController:(UISearchController*)searchController {
/*出現、消失、輸入文字時都會觸發*/
}
- (void)searchBarCancelButtonClicked:(UISearchBar*)searchBar {
/*點擊取消按鈕觸發*/
}
- (void)searchBarSearchButtonClicked:(UISearchBar*)searchBar {
/*點擊搜索按鈕觸發*/
}
-(void)willPresentSearchController:(UISearchController*)searchController {
/*search bar即將出現*/
}
-(void)willDismissSearchController:(UISearchController*)searchController {
/*search bar即將消失*/
}
如果進入控制則就要讓search controller 呈現選中狀態
- (void)viewDidAppear:(BOOL)animated {
? ? [super viewDidAppear:animated];? ? ????[self performSelector:@selector(searchBarBecomeResponder)withObject:nil afterDelay:0];
}
- (void)searchBarBecomeResponder {
? ? [self.searchController.searchBar becomeFirstResponder];
}
獲取Search Controller 的searchBar里面的textField
self.searchBarTextField = [self.searchController.searchBar valueForKey:@"searchField"];
發現問題
-[TableView updateSearchResultsForSearchController:]: unrecognized selector sent to instance 0x7fff278aec00
這個問題是因為你遵守了UISearchResultsUpdating代理,但是沒有實現- (void)updateSearchResultsForSearchController:(UISearchController*)searchController方法,實現這個方法即可;
我在創建的過程中,沒有實現frame等方法,是因為我直接將searchBar加在table view header view上面。