国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

UITableView的搜索:SearchBar和SearchDisplayController;UISearchController

2019-11-14 18:10:26
字體:
來源:轉載
供稿:網友

之前我寫過一篇關于在tableView中利用謂詞搜索的隨筆,當時使用的是自定義textField,最近在寫電子書,需要在書目時實現搜索功能.所以在此把以前用于實現搜索功能系統提供的的SearchBar和SearchDisplayController的方法在這里和大家分享一下.不過在iOS8滯后,蘋果已經不再推薦我們是使用這兩個舊東西,而是讓我們使用UISearchController,自然我也會把這個新東西的用法在這里演示一下.

 

SearchBar和SearchDisplayController
先在視圖xib文件中添加tableView,在表上面添加SearchBar和SearchDisplayController.如圖:

 

需要用到的協議有:<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchDisplayDelegate>

我在這里聲明了兩個數據,用來保存搜索數據和搜索結果:

@PRoperty(nonatomic,retain)NSMutableArray *dataArray;
@property(nonatomic,retain)NSMutableArray *resultArray;

初始化數組:
self.dataArray=[[NSMutableArray alloc]initWithObjects:@"張三",@"李四",@"王五",@"阿五",@"云飛",@"asd", nil];

 

在這里其實有兩個表,一個是搜索前的所有數據,另一個是展示搜索結果,所以在寫tabbleView的協議時需要進行區分:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    if (tableView==self.tableView) {        return self.dataArray.count;    }    else    {        return self.resultArray.count;    }}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *str=@"cell";    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:str];    if (cell==nil) {        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];    }    if (tableView==self.tableView) {        cell.textLabel.text=self.dataArray[indexPath.row];    }    else    {        cell.textLabel.text=self.resultArray[indexPath.row];    }    return cell;}

 

接著是UISearchBarDelegate,UISearchDisplayDelegate的協議方法

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{    NSLog(@"搜索開始");    return YES;}-(BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar{    NSLog(@"搜索結束");    return YES;}-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{    NSPredicate *preicate=[NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",searchString];    if (self.resultArray!=nil) {        [self.resultArray removeAllObjects];    }    self.resultArray=[NSMutableArray arrayWithArray:[self.dataArray filteredArrayUsingPredicate:preicate]];    NSLog(@"%lu",(unsigned long)self.resultArray.count);    return YES;}

 

在這里我們用來區分的關鍵代碼還是謂詞,相對于正則表達式,謂詞已經是很簡單了.不過我還是記不住

運行結果如下:

 

雖然這個很好用,但是蘋果公司在iOS8的時候已經講他打上了紅杠,推薦我們使用的是UISearchController

首先需要添加的協議有<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchResultsUpdating>

還是現在xib文件中拖入一個tabView,為了不相互影響,我將兩個放在不同的視圖里

同樣聲明兩個數組,功能同上;還有一個UIsearchController(因為我不知道拖的話是哪個控件,所以只好手寫):

@property(nonatomic,retain)UISearchController *seachController;
@property(nonatomic,retain)NSMutableArray *resultArray;
@property(nonatomic,retain)NSMutableArray *dataArray;

 

初始化數組并手動創建searchController:

self.dataArray=[[NSMutableArray alloc]initWithObjects:@"張三",@"李四",@"王五",@"阿五",@"云飛",@"asd", nil];        self.seachController=[[UISearchController alloc]initWithSearchResultsController:nil];    self.seachController.searchResultsUpdater=self;    self.seachController.dimsBackgroundDuringPresentation=NO;    self.seachController.hidesNavigationBarDuringPresentation=NO;    self.seachController.searchBar.frame=CGRectMake(self.seachController.searchBar.frame.origin.x, self.seachController.searchBar.frame.origin.y, self.seachController.searchBar.frame.size.width, 44.0);    self.tableView.tableHeaderView=self.seachController.searchBar;

 

同樣道理,這里也是有兩個搜索結果,所以需要判斷:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    if (!self.seachController.active) {        return self.dataArray.count;    }    else    {        return self.resultArray.count;    }}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static NSString *str=@"cell";    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:str];    if (cell==nil) {        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:str];    }    if (!self.seachController.active) {        cell.textLabel.text=self.dataArray[indexPath.row];    }    else    {        cell.textLabel.text=self.resultArray[indexPath.row];    }    return cell;}

 

協議方法,在這里我們用的還是謂詞判斷

-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{    NSString *searchString=self.seachController.searchBar.text;    NSPredicate *preicate=[NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@",searchString];    if (self.resultArray!=nil) {        [self.resultArray removeAllObjects];    }    self.resultArray=[NSMutableArray arrayWithArray:[self.dataArray filteredArrayUsingPredicate:preicate]];    NSLog(@"%lu",(unsigned long)self.resultArray.count);    [self.tableView reloadData];}

 

結果演示:

 

我寫的隨筆大部分是有源碼的,如果有想要的,可以聯系我.我的個人資料里有我的QQ.

 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 崇礼县| 长宁区| 文山县| 当阳市| 涟源市| 阳泉市| 长宁区| 闸北区| 康平县| 宜昌市| 仙桃市| 获嘉县| 怀化市| 平阳县| 衡阳市| 广汉市| 闵行区| 南部县| 丽水市| 灵石县| 江永县| 昭通市| 湖州市| 眉山市| 渝中区| 抚顺县| 永昌县| 宜良县| 时尚| 射阳县| 黑河市| 桃园县| 轮台县| 英超| 巫山县| 达尔| 武威市| 乐清市| 吴江市| 萍乡市| 冷水江市|