UISearchController IOS8之后推荐使用的搜索控件

来源:互联网 发布:sqlserver去重复查询 编辑:程序博客网 时间:2024/05/22 13:15

百度 IOS搜索栏 你会找到很多关于IOS8之前的搜索实现demo和案例。当前官方已经不推荐了,既然如此 就是用官方推荐的吧。致于优点什么的 自己百度吧。


如果你觉得无所谓可以忽略我的废话。代码中也有说明的[细节住处注意红色的代码]。

需要特别说明一下,在我测试的时候出现了一个bug:

当我的搜索栏处于编辑状态的时候,我切换了控制器。直接导致搜索栏显示在我切换后的控制器的界面上了。对此我感到很纳闷。因为在我切换控制器的时候,我之前的搜索栏所在的控制器已经释放了,但是搜索栏却依然存在于切换后的控制器界面上。我试着在viewWillDisapear中将搜索栏等属性置空 或者从其supperView中remove,依然还是重现了我上述的bug。综上我感觉这个搜索栏控制器因为不是有其所在界面的控制器管理的。

对于上面描述的bug 造成的直接原因就是 当我的搜索栏处于编辑状态的时候 我直接就切换了控制器。如果要避免这个bug 可以设置搜索栏的蒙板 或者设置编辑搜索栏时隐藏状态栏和导航条。这样在切换控制器的时候 必须退出搜索栏的编辑才能切换。


下面是我的demo, 随机生成100个cell的数据源 内容格式为 0~99+三个英语字母

@interface SearchVC ()<UITableViewDataSource,UISearchControllerDelegate, UISearchResultsUpdating>



@property (nonatomic,strongUITableView              *tableView;

@property (nonatomic,strongUISearchController       *searchController;


//数据源

@property (nonatomic,strong) NSMutableArray            *dataList;

@property (nonatomic,strong) NSMutableArray            *searchList;



@end


@implementation SearchVC


- (void)viewDidLoad

{

    [superviewDidLoad];

    [selfinitSearchUIAndData];

    

}


//在视图即将消失的时候释放资源,不然搜索栏会一值停留在洁面上[应该是添加到窗口上了,因为控制器已经释放了]

- (void)viewWillDisappear:(BOOL)animated

{

    [superviewWillDisappear:animated];

    

    

}


- (void)initSearchUIAndData

{

    self.view.backgroundColor = [UIColorwhiteColor];

    self.navigationItem.title =@"搜索IOS8之后";

    

    //初始化数据源

    _dataList   = [NSMutableArrayarray];

    _searchList = [NSMutableArrayarray];

    

    self.dataList = [NSMutableArrayarrayWithCapacity:100];//容量

    

    //产生100数字+三个随机字母

    for (NSInteger i =0; i < 100; i++)

    {

        [self.dataListaddObject:[NSStringstringWithFormat:@"%ld%@",(long)i,[selfshuffledAlphabet]]];

        

    }

    

    _tableView = [[UITableViewalloc]initWithFrame:CGRectMake(0,0, screenWidth,screenHeight)];

    

    //设置代理

//    _tableView.delegate   = self;

    _tableView.dataSource =self;

    _tableView.separatorStyle =UITableViewCellSelectionStyleNone;//取消分割线

    

    //创建UISearchController

    _searchController = [[UISearchControlleralloc]initWithSearchResultsController:nil];

    //设置代理

    _searchController.delegate =self;

    _searchController.searchResultsUpdater =self;

    

    

    //设置UISearchController的显示属性,以下3个属性默认为YES

    //搜索时,背景变暗色

//    _searchController.dimsBackgroundDuringPresentation = NO;

    //搜索时,背景变模糊

//    _searchController.obscuresBackgroundDuringPresentation = NO;

    //隐藏导航栏

//    _searchController.hidesNavigationBarDuringPresentation = NO;

    

    _searchController.searchBar.frame =CGRectMake(self.searchController.searchBar.frame.origin.x,self.searchController.searchBar.frame.origin.y,self.searchController.searchBar.frame.size.width,44.0);

    

    // 添加 searchbar headerview

    self.tableView.tableHeaderView =_searchController.searchBar;

    

    [self.viewaddSubview:_tableView];

    

    

}


//生成三个随机字母

- (NSString *)shuffledAlphabet

{

    NSMutableArray * shuffledAlphabet = [NSMutableArrayarrayWithArray:@[@"A",@"B",@"C",@"D",@"E",@"F",@"G",

                                                                        @"H",@"I",@"J",@"K",@"L",@"M",@"N",

                                                                        @"O",@"P",@"Q",@"R",@"S",@"T",@"U",

                                                                        @"V",@"W",@"X",@"Y",@"Z"]];

    

    NSString *strTest = [[NSStringalloc]init];

    

    for (int i =0; i < 3; i++)

    {

        int x =arc4random() % 25;//0~24的随机数

        strTest = [NSStringstringWithFormat:@"%@%@",strTest,shuffledAlphabet[x]];

        

    }

    

    return strTest;

}


#pragma mark - UITableViewDataSource


//table 返回的行数

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

{

    if (self.searchController.active)//如果正在搜索

    {

        return [self.searchListcount];

        

    }

    else

    {

        return [self.dataListcount];

    }

    

}


//返回单元格内容

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

{

    staticNSString *flag = @"cell";

    UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:flag];

    

    if (cell ==nil)

    {

        cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:flag];

    

    }

    if (self.searchController.active)//如果正在搜索

    {

        [cell.textLabelsetText:self.searchList[indexPath.row]];

        

    }

    else//如果没有搜索

    {

        [cell.textLabelsetText:self.dataList[indexPath.row]];

        

    }

    return cell;

    

}


#pragma mark - UISearchControllerDelegate

//测试UISearchController的执行过程


- (void)willPresentSearchController:(UISearchController *)searchController

{

    NSLog(@"willPresentSearchController");

    

}


- (void)didPresentSearchController:(UISearchController *)searchController

{

    NSLog(@"didPresentSearchController");

    

}


- (void)willDismissSearchController:(UISearchController *)searchController

{

    NSLog(@"willDismissSearchController");

    

}


- (void)didDismissSearchController:(UISearchController *)searchController

{

    NSLog(@"didDismissSearchController");

    

}


- (void)presentSearchController:(UISearchController *)searchController

{

    NSLog(@"presentSearchController");

    

}



-(void)updateSearchResultsForSearchController:(UISearchController *)searchController

{

    

    NSLog(@"updateSearchResultsForSearchController");

    NSString *searchString = [self.searchController.searchBartext];

    NSPredicate *preicate = [NSPredicatepredicateWithFormat:@"SELF CONTAINS[c] %@", searchString];

    if (self.searchList!=nil)

    {

        [self.searchListremoveAllObjects];

        

    }

    //过滤数据

    self.searchList = [NSMutableArrayarrayWithArray:[_dataListfilteredArrayUsingPredicate:preicate]];

    //刷新表格

    [self.tableViewreloadData];

    

}


- (void)dealloc

{

    [ToolsNSLogClassDestroy:self];

    _tableView        =nil;

    _searchController =nil;

    _dataList         =nil;

    _searchList       =nil;

}

@end

界面效果:

这是一个有bug的 图片



这是修复bug之后的界面效果:



0 0
原创粉丝点击