`

IOS之表视图添加搜索栏

 
阅读更多

        下面是我们要实现的效果。本效果是在上一篇自定义表视图的基础上进行更改的。http://ikrboy.iteye.com/blog/2004032


   

1.将Search bar and search display拖动到ViewController中。不要添加Search Bar.


 

2.修改ViewController的头文件

#import <UIKit/UIKit.h>

@interface IkrboyViewController4 : UIViewController
{
    NSArray *dataArr;//用于显示表视图的数据
    NSArray *allDataArr;//存储所有数据,通过关键词搜索将搜索结果赋值给dataArr
}
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;

@end

 

 3.修改自定义方法initTableViewData。将ScopeBar隐藏是考虑到iphone的显示高度问题。可自行决定。

-(void)initTableViewData{
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *plistPath = [bundle pathForResource:@"user_head" ofType:@"plist"];
    allDataArr = [[NSArray alloc] initWithContentsOfFile:plistPath];
    dataArr = [NSArray arrayWithArray:allDataArr];
    NSLog(@"table data count = %d",[allDataArr count]);
    
    //设定搜索栏ScopeBar隐藏
    [self.searchBar setShowsScopeBar:NO];
    [self.searchBar sizeToFit];
}

4.添加SearchBar的三个事件触发

//以下三个方法实现SearchBar的搜索功能
//当文本内容发生改变时候,向表视图数据源发出重新加载消息
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString scope:self.searchBar.selectedScopeButtonIndex];
    //YES情况下表视图可以重新加载
    return YES;
}

// 当Scope Bar选择发送变化时候,向表视图数据源发出重新加载消息
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:self.searchBar.text scope:searchOption];
    // YES情况下表视图可以重新加载
    return YES;
}

//点击cancel按钮的事件
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
    //查询所有
    [self filterContentForSearchText:@"" scope:-1];
}

 
 5.自定义关键词搜索功能

//自定义搜索方法,根据关键词从allDataArr中搜索到满足搜索条件的元素,并将匹配的数组赋值给dataArr,由于dataArr是表视图的数据源,因此表视图的记录也会随之改变。
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSUInteger)scope;
{
    if([searchText length]==0)
    {
        //查询所有
        dataArr = [NSArray arrayWithArray:allDataArr];
        NSLog(@"dataArr count = %d",[dataArr count]);
        return;
    }
    
    NSPredicate *scopePredicate;
    
    switch (scope) {
        case 0:
            scopePredicate = [NSPredicate predicateWithFormat:@"(SELF.itemName contains[c] %@) OR (SELF.itemImagePath contains[c] %@)",searchText,searchText];
            NSLog(@"searchText=%@",searchText);
            dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
            break;
        case 1:
            scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemName contains[c] %@",searchText];
            dataArr = [NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
            break;
        case 2:
            scopePredicate = [NSPredicate predicateWithFormat:@"SELF.itemImagePath contains[c] %@",searchText];
            dataArr =[NSArray arrayWithArray:[allDataArr filteredArrayUsingPredicate:scopePredicate]];
            break;
    }
}

 6.修改cellForRowAtIndexPath方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"myTableCell";
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    //add code begin:important,for showing searching results
    //不对cell进行空值的判断,会导致在搜索时,找不到对应identifier的cell而报错。
    if (cell == nil) {
    //搜索结果采用简单表视图cell的style,并非自定义的表视图cell的style    
    cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        NSUInteger row = [indexPath row];
        NSDictionary *rowDict = [dataArr objectAtIndex:row];
        cell.textLabel.text =  [rowDict objectForKey:@"itemName"];
        NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
        cell.imageView.image =  [UIImage imageNamed:imagePath];
    }
    //add code end

    NSUInteger row = [indexPath row];
    NSDictionary *rowDict = [dataArr objectAtIndex:row];
    cell.label.text =  [rowDict objectForKey:@"itemName"];
    NSLog(@"cell.label.text =  %@",[rowDict objectForKey:@"itemName"]);
    
    NSString *imagePath = [rowDict objectForKey:@"itemImagePath"];
    cell.image.image = [UIImage imageNamed:imagePath];
    NSLog(@"cell.image.image  =  %@",imagePath);
    
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    
    return cell;
}

 

  • 大小: 34 KB
  • 大小: 46.6 KB
  • 大小: 74.3 KB
分享到:
评论

相关推荐

    IOS 带搜索栏表视图

    在iOS开发中,"IOS 带搜索栏表视图"是一个常见的功能需求,它能够为用户提供方便的数据筛选和查找体验。在这个实例中,我们关注的是`Search Bar and Search Display Controller`,而不是独立的`Search Bar`控件。`...

    ios搜索功能的实现源码

    在iOS开发中,实现搜索功能是一项常见的任务,特别是在拥有大量数据需要展示的场景下,如表视图(UITableView)。这个“ios搜索功能的实现源码”提供了实例代码,可以帮助开发者理解并快速集成搜索功能到自己的应用...

    iOS tableView点击更多 搜索栏

    总的来说,实现"iOS tableView点击更多 搜索栏"的功能涉及到UITableView的高级用法,包括自定义单元格行为、搜索过滤和用户交互处理。这要求开发者对iOS SDK有深入的理解,同时具备良好的编程实践。通过这个功能的...

    ios-tableView顶部视图.zip

    首先,`tableView`的顶部视图通常指的是`tableHeaderView`,它可以用来放置一些额外的UI元素,如搜索栏、标签或者自定义视图。在这个案例中,顶部视图实现了下拉放大和上推渐变隐藏的效果,这是一种增强用户体验的...

    ios-仿苹果地图搜索滑动视图.zip

    在仿苹果地图搜索滑动视图中,滚动视图通常是主容器,用来承载地图视图和其他元素,如搜索栏、筛选选项等。滚动视图的两个主要属性是contentSize和contentOffset,contentSize定义了视图内容的总尺寸,而...

    ios-搜索.zip

    这个控制器包含了搜索栏(UISearchBar)和搜索结果展示视图,允许用户在应用内部进行实时搜索,并能处理显示搜索结果的逻辑。 在"slideDemo"项目中,开发者可能会演示如何设置和配置UISearchController。这包括设置...

    ios7更改导航栏搜索框的取消按钮

    本文将详细讲解如何在iOS 7中更改导航栏搜索框的取消按钮,并确保这种改变能够兼容iOS 6。 首先,我们需要了解在iOS中添加搜索框的基本步骤。这通常通过在导航栏上添加一个`UISearchBar`实例来实现。创建`...

    移动软件开发-3期(KC015) 表视图 教学设计.doc

    4. **添加索引和搜索栏**:索引可以帮助用户快速浏览长列表,而UISearchBar可以提供搜索功能,方便用户查找特定内容。表视图可以通过实现相关方法添加这两项功能。 5. **Storyboard自定义单元格**:通过Storyboard...

    swift-一劳永逸iOS网页视图控制器通用类封装

    "swift-一劳永逸iOS网页视图控制器通用类封装"项目就是针对这一需求,提供了一个通用的WebViewController类,旨在简化开发者的工作,提高代码复用性。 这个项目的核心是创建一个自定义的`SureWebViewController`,...

    IOS自定义搜索框

    可以使用UIImage设置这些图标,并通过`setImage:`方法将其添加到搜索栏上。 3. **动画效果**:增加动态效果,如搜索框的出现、消失或展开收缩动画,能提升用户的交互体验。可以使用Core Animation或者SwiftUI的动画...

    几个搜索功能的例子IOS

    1. **UISearchBar**:这是iOS中最常见的搜索界面组件,通常用于顶部栏或者表视图的头部。开发者可以通过监听`UISearchBar`的`searchBar:textDidChange:`代理方法来实时处理用户的输入,并根据输入内容过滤数据源。 ...

    ios-仿电商的搜索页面.zip

    在iOS开发中,仿照电商应用的搜索页面是一项常见的任务,因为这类页面是电商应用的核心功能之一,用户可以通过它快速找到所需的商品。本项目“ios-仿电商的搜索页面.zip”提供了一个实现这一功能的实例,包括历史...

    IOS 搜索及搜索bar

    UISearchController不仅包含了UISearchBar的功能,还管理了一个结果展示视图,可以无缝集成到导航栏或表视图中。开发者可以通过设置代理方法来响应用户的搜索请求,过滤数据源并更新显示的结果。 **拼音转Pinyin**...

    IOS 入门开发之导航栏按钮切换

    本专题“iOS入门开发之导航栏按钮切换”将深入讲解如何在导航栏上创建并切换不同功能的按钮,帮助开发者更好地理解和实现这一功能。 一、导航栏基础 1. 导航栏在iOS中的角色:导航栏位于每个屏幕的顶部,通常包含一...

    一步一步学习_iOS_6_编程(第四版)

    第十三部分:在表视图中添加搜索栏 第十四部分:如何在导航界面隐藏Tab Bar 第十五部分:Objective-C基础知识-介绍面向对象的编程 第十六部分:如何在你的iPhone App中发送邮件 第十七部分:持续改善Recipe App的...

    史上最全的ios开发源码

    游戏引擎之雷电游戏的激光子弹 指示器类 指示器(HUD)之Android Style Toast 指示器-Activity Bar 指示器--Notify HUD 指示器之MBAlertView 指示器之YLActivityIndicatorView 其他类 财付通打印票据和拖动银行卡...

    IOS编程入门-精品教程

    - **添加搜索栏**:展示如何在表视图中添加搜索栏,并实现基本的搜索功能。 #### 第十四部分:如何在导航界面隐藏Tab Bar - **隐藏Tab Bar**:提供技巧来实现在特定的导航界面中隐藏Tab Bar。 #### 第十五部分:...

    一步步学IOS5编程完整版

    第十三部分:在表视图中添加搜索栏 第十四部分:如何在导航界面隐藏Tab Bar 第十五部分:Objective-C基础知识-介绍面向对象的编程 第十六部分:如何在你的iPhone App中发送邮件 第十七部分:持续改善Recipe App的...

Global site tag (gtag.js) - Google Analytics