zoukankan      html  css  js  c++  java
  • iOS 搜索条使用详解

      在ios开发中搜索条的使用挺常见的,不过之前一直没用到也没细细研究,最近做外包项目的时候刚好用到,在这里记录一下使用的过程,只要理解了原理,其实还是比较简单的!上传的图片有点大,刚好可以看清楚它的使用效果!

      我喜欢一步步的解析控件使用过程,其实真正的用心做一件事情是很享受的,虽然现在的社会都很注重效率和回报,这也是中国这种社会环境下难出大师级的人物的很重要的一个因素。扯得有点远了,只是希望国内开发者不要太急功近利,熟练应用本不是难事,一点点积累就好。下面开始搜索条 

    UISearchBar 和 UISearchDisplayController 的使用介绍。

      第一步:添加UISearchBarDelegate,UISearchDisplayDelegate 委托

      第二步:就是UISearchBar 和UISearchDisplayController的使用

     //搜索框

        self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(10, 15, self.view.bounds.size.width-20, 45)]autorelease];

        searchBar.placeholder=@"输入城市名或拼音";

        searchBar.delegate = self;

        searchBar.backgroundColor=[UIColor clearColor];

        searchBar.backgroundImage=[UIImage imageNamed:@"搜索背景"];

        searchBar.keyboardType=UIKeyboardTypeDefault;

        myTableView.tableHeaderView = searchBar;

        searchBar.autocorrectionType = UITextAutocorrectionTypeNo;

        searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;

        

        

        self.searchdispalyCtrl = [[[UISearchDisplayController  alloc] initWithSearchBar:searchBar contentsController:self]autorelease];

        //设置取消按钮文字颜色

        searchdispalyCtrl.searchBar.tintColor=BB_Yanzheng_Color;

        //search dispalyCtrl.active = NO;

        //[searchdispalyCtrl.searchResultsTableView setHidden:NO];

        searchdispalyCtrl.delegate = self;

        searchdispalyCtrl.searchResultsDelegate=self;

        searchdispalyCtrl.searchResultsDataSource = self;

      这里面有两个点需要注意一下,一个是 myTableView.tableHeaderView = searchBar;这里是将searchbar放在对应列表的第一个section之中,而且section的高度不用设置,当然可以通过addsubview添加这种方式会产生一种移位,建议默认的方式比较好些!另一点是UISearchDisplayController是对searchbar的进一步封装,里面的东西确实简化了好多,可以采用这种方法设置取消按钮文本的颜色searchdispalyCtrl.searchBar.tintColor=BB_Yanzheng_Color;

      第三步:相关委托的使用

    我们通过实验发现点击searchbar的输入框会弹出一个独立的tableview视图,并显示一个取消按钮,搜索的数据显示在这个独立的视图列表中。而这个视图列表和普通的列表用法一样,需要设置

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    {

        if (tableView == self.searchDisplayController.searchResultsTableView)

        {

            return 1;

        }

        else

        {

            return 26;

        }

    }

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

    {

        if (tableView == self.searchDisplayController.searchResultsTableView)

        {

            NSLog(@"我去:%@",searchResult);

            return [searchResult count];

        }

        else

        {

            if (section==0||section==1||section==2||section==3)

            {

                return 1;

            }

            if (isZiMu)

            {

                NSLog(@"zimugeshu:%@,%d",[zimuList objectAtIndex:section-4],[[cityGroupList objectForKey:[zimuList objectAtIndex:section-4]]count]);

                return [[cityGroupList objectForKey:[zimuList objectAtIndex:section-4]]count];

            }

           

            /*

            char mychar='a';

            //当前字母

            NSString *zimu=[NSString stringWithFormat:@"%c",mychar-32];

            

            //NSString *zimu=[NSString stringWithFormat:@"%c",c];

            if (![zimu isEqualToString:@"i"]&&![zimu isEqualToString:@"o"]&&![zimu isEqualToString:@"u"]&&![zimu isEqualToString:@"v"])

            {

                NSLog(@"zimugeshu:%@,%d",zimu,[[cityGroupList objectForKey:zimu]count]);

                return [[cityGroupList objectForKey:[zimuList objectAtIndex:section-4]]count];

                

            }*/

           

            return 0;

            

        }

        

    }

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    {

        if (tableView == self.searchDisplayController.searchResultsTableView)

        {

            return 45;

        }

        if (indexPath.section==0)

        {

            return 0;

        }

        if (indexPath.section==1||indexPath.section==2)

        {

            return 73;

        }

        if (indexPath.section==3)

        {

            //超过的话固定显示203

            if (17+([remenCityList count]/3+1)*47+18<=223)

            {

                if ([remenCityList count]!=0&&[remenCityList count]%3==0)

                {

                    return 17+([remenCityList count]/3)*47;

                }

                return 17+([remenCityList count]/3+1)*47;

            }

            return 223;

        }

        return 45;

    }

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

    {

        if (tableView == self.searchDisplayController.searchResultsTableView)

        {

            return 0;

        }

        if (section!=0)

        {

            return 32;

        }

        return 0.01f;

    }

    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

    {

        if (tableView == self.searchDisplayController.searchResultsTableView)

        {

            return 0.01;

        }

        return 0.01f;

    }

    这些个基本的高度和行数 模块信息,当然列表的显示更是必不可少

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

    {

        if (tableView == self.searchDisplayController.searchResultsTableView)

        {

            static NSString *simpleTableIdentifier = @"RecipeCell";

            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

            if (cell == nil)

            {

                cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]autorelease];

            }

            else

            {

                for(UIView *view in cell.contentView.subviews)

                {

                    [view removeFromSuperview];

                }

            }

            //cell.textLabel.text = [searchResult objectAtIndex:indexPath.row];

            //[cell.textLabel setTextColor:BB_Red_Color];

            //NSLog(@"zheli:%@,%d,%@",[searchResult objectAtIndex:indexPath.row],indexPath.row,self.searchDisplayController.searchResultsTableView);

            

            //城市名称

            UILabel *labLeft = [[[UILabel alloc]init]autorelease];

            labLeft.backgroundColor = [UIColor clearColor];

            labLeft.textAlignment = NSTextAlignmentLeft;

            labLeft.font = [UIFont systemFontOfSize:15];

            labLeft.textColor = [UIColor blackColor];

            labLeft.frame = CGRectMake(15, 15, 200, 15);

            labLeft.text=[searchResult objectAtIndex:indexPath.row];

            [cell.contentView addSubview:labLeft];

            return cell;

        }

    }

    上面列出的只是显示信息,真正数据的搜索要依赖于下面的委托方法实现

    #pragma mark - UISearchDisplayDelegate

    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString

    {

        [self filterContentForSearchText:searchString

                                   scope:[self.searchBar scopeButtonTitles][self.searchBar.selectedScopeButtonIndex]];

        

        NSLog(@"woshuoba:%@,%@,%d,%@",searchString,self.searchBar.scopeButtonTitles,self.searchBar.selectedScopeButtonIndex,[self.searchBar scopeButtonTitles][self.searchBar.selectedScopeButtonIndex]);

        return YES;

    }

    -(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope

    {

        NSMutableArray *tempResults = [[[NSMutableArray array]init]autorelease];

        NSMutableArray *tempResultsId = [[[NSMutableArray array]init]autorelease];

        [tempResults removeAllObjects];

        [tempResultsId removeAllObjects];

     

        NSUInteger searchOptions = NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch;

        NSLog(@"sousuo:%@,%@,%@",searchText,scope,storeResults);

        for (int i = 0; i < storeResults.count; i++)

        {

            NSString *storeString = [[storeResults objectAtIndex:i]objectForKey:@"name"];

            

            NSRange storeRange = NSMakeRange(0, storeString.length);

            

            NSRange foundRange = [storeString rangeOfString:searchText options:searchOptions range:storeRange];

           

            

            if (foundRange.length)

            {

                 NSLog(@"foundRange:%d,%d",foundRange.length,foundRange.location);

                [tempResults addObject:storeString];

                [tempResultsId addObject:[[storeResults objectAtIndex:i]objectForKey:@"id"]];

            }

            

            

            NSLog(@"wodejieguo:%@,%@",[[storeResults objectAtIndex:i]objectForKey:@"id"],storeString);

        }

        //清空搜索内容Id

        [self.searchResultId removeAllObjects];

        [self.searchResult removeAllObjects];

        [self.searchResultId addObjectsFromArray:tempResultsId];

        [self.searchResult addObjectsFromArray:tempResults];

        NSLog(@"searchResult:%@,%@",searchResult,searchResultId);

        

    }

    说道这里关于搜索条的使用已经基本完成,当然搜索列表选中跳页可以借助自定义委托来实现,这里就不多少了!

  • 相关阅读:
    你的系统需要做系统集成测试么?
    测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序
    RikMigrations 或 Migrator.NET 进行自动化的数据库升级
    单元测试
    C#反射
    J2EE--Struts2基础开发
    Dynamics CRM 客户端的插件调试
    于快速创建 IEqualityComparer<T> 实例的类 Equality<T>
    ToolBox Analysis & Design
    实现$.fn.extend 和$.extend函数
  • 原文地址:https://www.cnblogs.com/bigant9527/p/3980838.html
Copyright © 2011-2022 走看看