下面是我們要實現的效果。本效果是在上一篇自定義表視圖的基礎上進行更改的。
1.將Search bar and search display拖動到ViewController中。不要添加Search Bar.
2.修改ViewController的頭文件
#import <UIKit/UIKit.h>@interface IkrboyViewController4 : UIViewController{ NSArray *dataArr;//用于顯示表視圖的數據 NSArray *allDataArr;//存儲所有數據,通過關鍵詞搜索將搜索結果賦值給dataArr}@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;@end
3.修改自定義方法initTableViewData。將ScopeBar隱藏是考慮到iphone的顯示高度問題。可自行決定。
-(void)initTableViewData{ NSBundle *bundle = [NSBundle mainBundle]; NSString *plistPath = [bundle pathForResource:@"user_head" ofType:@"plist"]; allDataArr = [[NSArray alloc] initWithContentsOfFile:plistPath]; dataArr = [NSArray arrayWithArray:allDataArr]; NSLog(@"table data count = %d",[allDataArr count]); //設定搜索欄ScopeBar隱藏 [self.searchBar setShowsScopeBar:NO]; [self.searchBar sizeToFit];}
4.添加SearchBar的三個事件觸發
//以下三個方法實現SearchBar的搜索功能//當文本內容發生改變時候,向表視圖數據源發出重新加載消息- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{ [self filterContentForSearchText:searchString scope:self.searchBar.selectedScopeButtonIndex]; //YES情況下表視圖可以重新加載 return YES;}// 當Scope Bar選擇發送變化時候,向表視圖數據源發出重新加載消息- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{ [self filterContentForSearchText:self.searchBar.text scope:searchOption]; // YES情況下表視圖可以重新加載 return YES;}//點擊cancel按鈕的事件- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ //查詢所有 [self filterContentForSearchText:@"" scope:-1];}
5.自定義關鍵詞搜索功能
//自定義搜索方法,根據關鍵詞從allDataArr中搜索到滿足搜索條件的元素,并將匹配的數組賦值給dataArr,由于dataArr是表視圖的數據源,因此表視圖的記錄也會隨之改變。- (void)filterContentForSearchText:(NSString*)searchText scope:(NSUInteger)scope;{ if([searchText length]==0) { //查詢所有 dataArr = [NSArray arrayWithArray:allDataArr]; NSLog(@"dataArr count = %d",[dataArr count]); return; } NSPredicate *scopePredicate; switch (scope) { case 0: scopePredicate = [NSPredicate predicateWithFormat:@"(SELF.itemName contains[c] %@) OR (SELF.itemImagePath contains[c] %@)",searchText,searchText]; NSLog(@"searchText=%@",searchText); dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]]; break; case 1: scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemName contains[c] %@",searchText]; dataArr = [NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]]; break; case 2: scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemImagePath contains[c] %@",searchText]; dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]]; break; }}
6.修改cellForRowAtIndexPath方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"myTableCell"; MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //add code begin:important,for showing searching results //不對cell進行空值的判斷,會導致在搜索時,找不到對應identifier的cell而報錯。 if (cell == nil) { //搜索結果采用簡單表視圖cell的style,并非自定義的表視圖cell的style cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; NSUInteger row = [indexPath row]; NSDictionary *rowDict = [dataArr objectAtIndex:row]; cell.textLabel.text = [rowDict objectForKey:@"itemName"]; NSString *imagePath = [rowDict objectForKey:@"itemImagePath"]; cell.imageView.image = [UIImage imageNamed:imagePath]; } //add code end NSUInteger row = [indexPath row]; NSDictionary *rowDict = [dataArr objectAtIndex:row]; cell.label.text = [rowDict objectForKey:@"itemName"]; NSLog(@"cell.label.text = %@",[rowDict objectForKey:@"itemName"]); NSString *imagePath = [rowDict objectForKey:@"itemImagePath"]; cell.image.image = [UIImage imageNamed:imagePath]; NSLog(@"cell.image.image = %@",imagePath); cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell;}
新聞熱點
疑難解答