@借用一組圖,來展示下UISearchDisplayController :?比如:搜索"萬通",彈出一個tableView ? ? 顯示出檢索有這2個字的地點

@UISearchDisplayController(搜索顯示控制器)詳解:
1.繼承于NSObject,它并不是一個視圖控制器,只是一個類,一個工具類
2.提供一個searchBar和一個搜索結果tableView
3.searchBar需要我們自己創建,添加到指點視圖,提供給UISearchDisplayController
4.搜索結果tableView由搜索控制器進行搜索后要顯示結果的時候創建,我們要制定一個 ? ? ? ?UIViewController負責顯示,并實現它的代理,指定delegate,dataSource(也就是,它會有2 ? ?個tableView,一個是需要顯示結果的時候才建立-----對應上圖第三個,一個是初始化的時 ? ?候就已經存在-----對應上圖第一個,但都是由同一個UIViewController控制)
5.設置自身代理UISearchDisplayDelegate
?@代碼舉例:(初始化)
~~~
// 1.創建一個UISearchBar,添加在tableView上面
UISearchBar * searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,0, 320, 80)];
searchBar.placeholder = @"國家名";
self.tableView.tableHeaderView = searchBar;
// 2.用創立的searchBar和UIViewController的view初始化出UISearchDisplayController
_searchDC = [[UISearchDisplayController alloc]initWithSearchBar:searchBar contentsController:self];
// 3.設置代理
_searchDC.searchResultsDelegate = self;
_searchDC.searchResultsDataSource = self;
_searchDC.delegate = self;
~~~
?@代碼舉例:(如何區分2個tableView)
~~~
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// searchResultsTableView屬性,will return non-nil. create if requested
if([tableView isEqual:self.searchDC.searchResultsTableView]){
return 1;
};
// tableView == self.tableView
return 1;
}
~~~
?@至于如何檢索出想要的結果(圖示3),執行下面的代理方法后,用數組self.searchResults跟往常基本的UITableView賦值步驟一樣,只是多了區分哪個tableView
~~~
現在來實現當搜索文本改變時的回調函數。這個方法使用謂詞進行比較,并講匹配結果賦給searchResults數組:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@",searchText];
self.searchResults = [self.allItems filteredArrayUsingPredicate:resultPredicate];
}
//接下來是UISearchDisplayController的委托方法,負責響應搜索事件:
#pragma mark - UISearchDisplayController delegate methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
[self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
return YES;
}
~~~
@這是網上總結出的3點不足,鏈接http://blog.sina.com.cn/s/blog_759d3e1201017zsi.html
~~~
3.不足之處
UISearchDisplayController從我使用過程中,感覺到有三點不足。
(1)使用UISearchDisplayController當鍵盤彈出來的時候,會默認把navagationBar給隱藏起來。如果不需要隱藏navagationBar,最好的處理方式就是重寫UISearchDisplayController的-(void)setActive:(BOOL)visible animated:(BOOL)animated方法:
自定義一個類CustomSearchDisplayController,繼承自UISearchDisplayController,然后在.m文件中重寫該方法,并在該方法中主動顯示navagationBar。
@implementation CustomDisplaySearchViewController
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
[self.searchContentsController.navigationController setNavigationBarHidden:NOanimated:NO];
}
@end
(2)UISearchDisplayController的tableView有一個標簽,當沒有匹配的結果時,默認會在tableView上顯示一個“No Result”的標簽。如果說想自定義這個標簽,可以通過循環遍歷出tableView上標簽。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString {
for (UIView* v in self.customDisplaySearch.searchResultsTableView.subviews) {
if ([v isKindOfClass: [UILabel class]] &&
[[(UILabel*)v text] isEqualToString:@"No Results"]) {
UILabel *label = (UILabel *)v;
label.text = @"沒有結果";
break;
}
}
return YES;
}
(3)UISearchDisplayController的UISearchBar輸入框當無輸入時,SearchResultsTableView無法根據個人需求讓表展示出來。我嘗試過通過點擊搜索欄delegate方法中去處理表展示問題,可是嘗試失敗了。
~~~
- 前言
- UITableView詳解(UITableViewCell(一)重中之重)
- UITableView詳解(UITableViewCell(二) 自定義cell)
- UITableView詳解(UITableViewCell(三) cell根據文本長度來自動調整cell高度)
- UITableView詳解(UITableViewCell(四) 增加 刪除 移動)
- UITabBarController詳解(一)UITabBarController的介紹和設置(偷了點懶,直接用了ARC)
- UITabBarController詳解(二)UITabBarController的代理方法以及模態顯示
- UISearchBar詳解(一)基本屬性
- UISearchBar詳解(二)數據刷選類:NSPredicate
- UISearchDisplayController 的使用
- UINavigationController詳解(一)
- UINavigationController詳解(二)UINavigationBar(UIBarButtonItem)
- UINavigationController詳解(三)UIToolBar
- UINavigationController詳解(四)iOS7新特性
- UIScrollView控件詳解
- UISwitch用法-以及-自定義UISwitch控件
- UIAlertView用法
- UILabel 的常見屬性和方法:
- UIPickerView(滾動選擇控制器)
- UIActivityIndicatorView(活動指示器 ---------> 網絡卡后加載,畫面,圖像加載閃爍的圓圈)
- UIStepper
- UIImagePickerController--------圖片選取器
- UITextView
- UITabBarController詳解(三)自定義UITabBarController
- UIWebView基本介紹