UISearchBarController 使用筆記

UISearchBar和UISearchDisplayController配合使用,是iOS8之前的使用方法,iOS8以后使用UISearchController,更方便簡單。

遵守協(xié)議<UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating>

@property(nonatomic,strong)UISearchController *searchController;

@property(nonatomic,strong)UITableView *searchResultTableView;

@property(nonatomic,strong)NSMutableArray *searchResultArray;

初始化控件searchController

- (UISearchController*)searchController {

if(!_searchController) {

_searchController= [[UISearchController alloc]initWithSearchResultsController:nil];

_searchController.searchResultsUpdater=self;

_searchController.searchBar.delegate=self;

_searchController.delegate=self;

_searchController.dimsBackgroundDuringPresentation=NO;//開始搜索時背景不顯示

_searchController.hidesNavigationBarDuringPresentation=YES;//搜索時隱藏NavigationBar

//searchBar樣式調(diào)整

_searchController.searchBar.tintColor= [YFRKitUtility colorFromHexString:@"0x3f75ff"];//設(shè)置searchBar按鈕字體顏色

_searchController.searchBar.barTintColor= [YFRKitUtility colorFromHexString:@"0xEDEDF3"];//設(shè)置searchBar前景色

_searchController.searchBar.layer.borderColor= [YFRKitUtility colorFromHexString:@"0xEDEDF3"].CGColor;//searchBar邊線顏色(為了掩藏黑線)

_searchController.searchBar.layer.borderWidth=0.5;

[_searchController.searchBar sizeToFit];

[_searchController.view addSubview:self.searchResultTableView];//把結(jié)果列表加在searchController的view上

self.definesPresentationContext=YES;//fix 顯示問題

}

return_searchController;

}

初始化結(jié)果列表,添加在searchController的view上

- (UITableView*)searchResultTableView {

if(!_searchResultTableView) {

CGFloat width =_searchController.view.width;

CGFloat height =_searchController.view.height;

_searchResultTableView= [[UITableView alloc]initWithFrame:CGRectMake(0,64, width, height)style:UITableViewStylePlain];

_searchResultTableView.backgroundColor= [YFRKitUtility colorFromHexString:@"0xEDEDF3"];

_searchResultTableView.separatorStyle=UITableViewCellSeparatorStyleSingleLine;

_searchResultTableView.dataSource=self;

_searchResultTableView.delegate=self;

_searchResultTableView.tableFooterView= [UIView new];//無數(shù)據(jù)時不顯示表格

}

return_searchResultTableView;

}

viewDidLoad代碼

- (void)viewDidLoad {

[super viewDidLoad];

self.navigationController.navigationBar.translucent=NO;//根據(jù)需要調(diào)整navigationBar

self.searchResultArray= [NSMutableArray array];//初始化數(shù)組

self.tableView.tableHeaderView=self.searchController.searchBar;//設(shè)置searchBar位置(self.tableView自行初始化)

self.edgesForExtendedLayout=UIRectEdgeNone;//解決跳轉(zhuǎn)頁面,返回后edgeInsets出錯問題

}

viewWillDisappear代碼

- (void)viewWillDisappear:(BOOL)animated {

[superviewWillDisappear:animated];

//頁面跳轉(zhuǎn)時根據(jù)需求設(shè)置active,不設(shè)置時可能需解決edgeInsets問題

if(_searchController.isActive) {

_searchController.active=NO;

[self.searchResultArray removeAllObjects];

if(_searchResultTableView) {[_searchResultTableView reloadData];}

}

}

UISearchViewController的代理回調(diào)

#pragma mark - UISearchResultsUpdating Delegate

//此方法只要searchBar有變化就會回調(diào),包括剛開始(active)和結(jié)束(cancel),所以需在搜索執(zhí)行方法中加非空判斷,或者使用其他回調(diào)方法

- (void)updateSearchResultsForSearchController:(UISearchController*)searchController {

DebugLog(@"updateSearchResultsForSearchController:%@", searchController.searchBar.text);

[self searchDataWithKeyword:searchController.searchBar.text];

}

#pragma mark - UISearchBar Delegate

文本變化回調(diào)

- (void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)searchText {

DebugLog(@"textDidChange:%@", searchText);

[self searchDataWithKeyword:searchText];

}

點擊搜索按鈕的回調(diào)

- (void)searchBarSearchButtonClicked:(UISearchBar*)searchBar {

DebugLog(@"searchBarSearchButtonClicked:%@", searchBar.text);

[self searchDataWithKeyword:searchBar.text];

}

點擊取消的回調(diào)

- (void)searchBarCancelButtonClicked:(UISearchBar*)searchBar {

[self.searchResultArray removeAllObjects];

if(_searchResultTableView) {

[_searchResultTableView reloadData];

}}

搜索數(shù)據(jù)的方法

- (void)searchDataWithKeyword:(NSString*)keyword {

[self.searchResultArray removeAllObjects];//清空之前的數(shù)據(jù)

//網(wǎng)絡(luò)請求或本地搜索

{//self.searchResultArray賦值并更新結(jié)果列表

[_searchResultTableView reloadData];

}}

解決tableView下拉刷新沖突

#pragma mark UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView*)scrollView {

if(_searchController.isActive) {

return;}

...//下拉刷新代碼

}

Tableview的回調(diào):區(qū)分原始tableview和resultTableview

#pragma mark -- UITableViewDelegate

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{

if(_searchController.isActive) {//搜索結(jié)果

return [self.resultArray count];

}else{//原始tableview

return [self.dataSource count];

}}

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {

if(_searchController.isActive) {//搜索結(jié)果

return 44;

}else{//原始tableview

return 60;

}}

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

staticNSString*identifier =@"";

UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:identifier];

if(!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

}

if(_searchController.isActive) {//搜索結(jié)果

}else{//原始tableview}

returncell;}

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{

[tableView deselectRowAtIndexPath:indexPath animated:YES];

if(_searchController.isActive) {//搜索結(jié)果

}else{//原始tableview

}}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容