iOS搜索框

1. UISearchBar 是UIKit提供的最简单,底层的一个控件,创建它:

 UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 44)];
 searchBar.delegate=self;
 [self.view addSubview:searchBar];

他有一个代理UISearchBarDelegate,代理方法里常用的是这个:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;

 

2. UISearchDisplayController 这个iOS 8后就被抛弃了,它其实是在UISearchBar上封装了一下,创建它:

    UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
    //[self.view addSubview:searchBar];
    table.tableHeaderView = searchBar;
    UISearchDisplayController *searchController = [[UISearchDisplayController alloc]initWithSearchBar:searchBar                                       contentsController:self];
    searchController.delegate = self;
    searchController.searchResultsDataSource = self;

它有两个代理:UISearchDisplayDelegate,searchResultsDataSource。常用代理方法:

//在搜索关键字发生改变时调用
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(nullable NSString *)searchString{
    return YES;
}

//在搜索表视图加载完毕后调用
-(void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView{

}

 

3. SecondViewController 这个是最新的搜索框,它也是基于UISearchBar封装的,创建它:

    ///搜索模块
    SecondViewController *searchResultVC = [SecondViewController new];
    UISearchController *searchController = [[UISearchController alloc]initWithSearchResultsController:searchResultVC];
    searchController.delegate = self;
    searchController.searchResultsUpdater = self;
    searchController.searchBar.frame = CGRectMake(0, 64, self.view.frame.size.width, 44);
    //table.tableHeaderView = searchController.searchBar;
    [self.view addSubview:searchController.searchBar];
    //searchController.dimsBackgroundDuringPresentation = NO;
    [searchController.searchBar sizeToFit];
    //搜索框颜色
    searchController.searchBar.barTintColor = [UIColor orangeColor];
    //searchController.definesPresentationContext=YES;

它的代理:UISearchControllerDelegate,UISearchResultsUpdating 。常用代理方法:

//要显示搜索结果,你必须手动刷新表视图
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{
}

 

想写一个类似iphone系统通讯录的Demo,它有一个可以上推的搜索框,借鉴了一下别人的代码(地址:https://github.com/ChenYilong/CYLSearchViewController )实现步骤简单记录一下:

1. 可以用代码,也可以用storyboard

代码方式:navigationController是AppDelegate的一个导航栏控制器属性

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    if([UINavigationBar conformsToProtocol:@protocol(UIAppearanceContainer)]) {
        [UINavigationBar appearance].tintColor = [UIColor redColor];
        [[UINavigationBar appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:18], NSForegroundColorAttributeName : [UIColor yellowColor]}];
        [[UINavigationBar appearance] setBarTintColor:
         [UIColor colorWithRed:22/255.0 green:59/255.0 blue:188/255.0 alpha:1]
         ] ;
        [[UINavigationBar appearance] setTranslucent:NO];
    }
    self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor=[UIColor whiteColor];
    
    RootViewController *rootVC=[[RootViewController alloc]init];
    self.navigationController=[[UINavigationController alloc]initWithRootViewController:rootVC];
    //rootVC.view.backgroundColor = [UIColor orangeColor];
    //[self.window addSubview:rootVC.view];
    self.window.rootViewController=self.navigationController;
    
    [self.window makeKeyAndVisible];
    
    return YES;
}

storyboard方式:要重写一下导航栏控制器或者在RootViewController中也行,主要是给AppDelegate的navigationController初始化一下值,因为后面要用到。

我这里自定义导航栏控制器中做的:

    //给AppDelegate的navigationController属性赋值(使用storyboard必须写)
    AppDelegate *delegate = ((AppDelegate *)[[UIApplication sharedApplication] delegate]);
    delegate.navigationController=self;

 

2. 然后就是在RootViewController中 写一个UISearchBar, 实现代理方法,在这个代理方法写让搜索框上推功能:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    NSLog(@"called when text starts editing");
    CYLSearchController *controller = [[CYLSearchController alloc] initWithNibName:@"CYLSearchController" bundle:nil];
    controller.delegate = self;
    self.searchController = [[UINavigationController alloc] initWithRootViewController:controller];
    [controller showInViewController:self];

}

这样就差不多完成了,详细实现可以参考他的代码。

我的通讯录Demo地址:https://github.com/nwgdegitHub/-iphoneAddressList (待完善)

 

posted @ 2017-09-07 16:46  liuw_flexi  阅读(491)  评论(0编辑  收藏  举报