• iOS中的UISearchBar


    #import "RootController.h"
    
    @interface RootController ()<UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate,UISearchResultsUpdating>
    
    @property (nonatomic, retain) NSMutableArray *dataList; // 存储数据源
    @property (nonatomic, retain) NSMutableArray *searchList; // 存储搜索结果
    @property (nonatomic, retain) UISearchController *searchController; // 管理搜索框
    
    @end
    
    
    
    @implementation RootController
    
    - (void)dealloc {
        self.dataList = nil;
        self.searchList = nil;
        self.searchController = nil;
        [super dealloc];
    }
    
    // 懒加载
    - (NSMutableArray *)dataList {
        if (!_dataList) {
            self.dataList = [NSMutableArray arrayWithCapacity:1];
            for (int i = 0; i < 50; i++) {
                [self.dataList addObject:[NSString stringWithFormat:@"%d - lanou", i]];
            }
        }
        return [[_dataList retain] autorelease];
    }
    
    - (NSMutableArray *)searchList {
        if (!_searchList) {
            self.searchList = [NSMutableArray arrayWithCapacity:1];
        }
        return [[_searchList retain] autorelease];
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        
        // 设置负责更新搜索结果控制器内容的对象, 要遵守协议<UISearchResultsUpdating>
        self.searchController.searchResultsUpdater = self;
        
        // 在搜索的时候下面的内容是否变暗
        self.searchController.dimsBackgroundDuringPresentation = NO;
        
        // 在搜索的时候导航栏是否隐藏
        self.searchController.hidesNavigationBarDuringPresentation = NO;
        
        // 设置frame
        self.searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
        
        // 将tableView 的页眉设置为searchBar
        self.tableView.tableHeaderView = self.searchController.searchBar;
        
    //    self.searchController.searchBar.showsScopeBar = YES;
    //    NSArray *titles = @[@"1", @"2"];
    //    self.searchController.searchBar.scopeButtonTitles = titles;
        // 设置背景图片
        self.searchController.searchBar.backgroundImage = [UIImage imageNamed:@"banner"];
        
        // 设置背景颜色
        // 移除searchBarBackground
    //    [[self.searchController.searchBar.subviews objectAtIndex:0] removeFromSuperview];
    //    self.searchController.searchBar.backgroundColor = [UIColor redColor];
        
        // 样式
    //    self.searchController.searchBar.barStyle = UIBarStyleDefault;
    //    self.searchController.searchBar.barStyle = UIBarStyleBlackOpaque;
        
        
        [self.searchController release];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (BOOL)prefersStatusBarHidden {
        return YES;
    }
    
    #pragma mark -- UISearchBarDelegate
    // 编辑输入事件
    - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
        
        return YES;
    }// return NO to not become first responder
    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
        
    }// called when text starts editing
    - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
        return YES;
    }// return NO to not resign first responder
    - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
        
    }// called when text ends editing
    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
        
    }// called when text changes (including clear)
    - (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text NS_AVAILABLE_IOS(3_0) {
        return YES;
    }// called before text changes
    
    // 点击按钮事件
    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
        
    }// called when keyboard search button pressed
    - (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {
        
    }// called when bookmark button pressed
    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
        
    }// called when cancel button pressed
    - (void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar NS_AVAILABLE_IOS(3_2) {
        
    }// called when search results button pressed
    
    
    // Scope 点击事件
    - (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope NS_AVAILABLE_IOS(3_0) {
        
    }
    
    
    
    
    #pragma mark - Table view data source
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    #warning Incomplete method implementation.
        // Return the number of rows in the section.
       
        // 如果对搜索框有操作
        if(self.searchController.active) {
            return [self.searchList count];
        }else {// 如果对搜索框没有操作
            return [self.dataList count];
        }
    }
    
    #pragma mark -- UISearchResultsUpdating
    - (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
        
        // 谓词 NSPredicate -- 它的操作是针对于数组类型的, 就好比数据库中的查询, 数据源就是数组, 好处是: 不需要写很多代码去操作数组, 同时也起到了过滤的作用. 我们可以编写简单的谓词语句, 就可以从数组中过滤出想要的数据.
        NSString *searchStr = [self.searchController.searchBar text];
        
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchStr];
        // SELF CONTAINS[c] %@, SELF表示要查询集合对象, CONTAINS[c]表示包含字符串, 其中c 不区分大小写.
        
        if (self.searchList != nil) {
            [self.searchList removeAllObjects];
        }
        // 过滤数据
        self.searchList = [NSMutableArray arrayWithArray:[self.dataList filteredArrayUsingPredicate:predicate]];
        
        // 刷新表格
        [self.tableView reloadData];
        
    }
    
    
    
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *identifer = @"reuse";
        
        // 根据重用标志, 去tableView的重用队列中取可用的cell
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifer];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifer];
        }
        
        // cell显示的内容
        if (self.searchController.active) {
            cell.textLabel.text = self.searchList[indexPath.row];
        }else {
            cell.textLabel.text = self.dataList[indexPath.row];
        }
        
        // Configure the cell...
        
        return cell;
    }
    
    
    
    
    @end
  • 相关阅读:
    Smart Client智能客户端技术
    SaaS介绍
    SaaS介绍
    开源软件介绍
    SaaS介绍
    SaaS介绍
    开源软件介绍
    开源软件介绍
    GPUCUDA安装
    Linux 下的段错误(Segmentation fault)调试方法
  • 原文地址:https://www.cnblogs.com/wohaoxue/p/4819917.html
Copyright © 2020-2023  润新知