iOS应用中UISearchDisplayController搜索效果的用法_IOS

新建Navigation-based Project。打开.xib文件,拖一个Search Bar and Search DisplayController 对象到Table View对象上方,如下图所示,选中File's Owner ,打开Connections面板:

现在我们来创建Search Bar和SearchDisplay Controller的出口。打开Assistant Editor,按住ctrl键,将SearchDisplay Controller拖到ViewController 的头文件中。创建一个名为searchDisplayController的出口,然后点Connect。

同样的方法为Search Bar创建连接。现在ViewController的头文件看起来像这样:

复制代码 代码如下:

#import <UIKit/UIKit.h>

@interface RootViewController : UITableViewController {   

UISearchDisplayController *searchDisplayController;     UISearchDisplayController *searchBar;   

NSArray *allItems;   

NSArray *searchResults;

@property (nonatomic, retain) IBOutlet UISearchDisplayController *searchDisplayController;

@property (nonatomic, retain) IBOutlet UISearchDisplayController *searchBar;

@property (nonatomic, copy) NSArray *allItems;

@property (nonatomic, copy) NSArray *searchResults; 

@end

你可能注意到,我初始化了两个NSArray。一个用于作为数据源,一个用于保存查找结果。在本文中,我使用字符串数组作为数据源。继续编辑.m文件前,别忘了synthesize相关属性:

  • @synthesize searchDisplayController;
  • @synthesize searchBar;
  • @synthesize allItems;
  • @synthesize searchResults;

在viewDidLoad 方法中,我们构造了我们的字符串数组:

复制代码 代码如下:

- (void)viewDidLoad {

     [super viewDidLoad]; 

     // [self.tableView reloadData];

     self.tableView.scrollEnabled = YES;

      NSArray *items = [[NSArray alloc] initWithObjects:                       @"Code Geass",                       @"Asura Cryin'",                       @"Voltes V",                       @"Mazinger Z",                       @"Daimos",                       nil]; 

     self.allItems = items;

     [items release]; 

     [self.tableView reloadData];

}

在Table View的返回TableView行数的方法中,我们先判断当前Table View是否是searchDisplayController的查找结果表格还是数据源本来的表格,然后返回对应的行数:

复制代码 代码如下:

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

  NSInteger rows = 0;   

  if ([tableView           isEqual:self.searchDisplayController.searchResultsTableView]){     

    rows = [self.searchResults count];

 }else{    

    rows = [self.allItems count];   

 }   

  return rows;

}

在tableView:cellForRowAtIndexPath:方法里,我们需要做同样的事:

复制代码 代码如下:

// Customize the appearance of table view cells.

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

   static NSString *CellIdentifier = @"Cell";  

   UITableViewCell *cell = [tableView                               dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil) { 

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

      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

   }  

   /* Configure the cell. */

   if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){   

    cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];

   }else{

       cell.textLabel.text = [self.allItems objectAtIndex:indexPath.row];

   }  

   return cell;

}

现在来实现当搜索文本改变时的回调函数。这个方法使用谓词进行比较,并讲匹配结果赋给searchResults数组:

复制代码 代码如下:

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

   NSPredicate *resultPredicate = [NSPredicate                                      predicateWithFormat:@"SELF contains[cd] %@",                                     searchText];  

   self.searchResults = [self.allItems filteredArrayUsingPredicate:resultPredicate];

}

接下来是UISearchDisplayController的委托方法,负责响应搜索事件:

复制代码 代码如下:

#pragma mark - UISearchDisplayController delegate methods

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

   [self filterContentForSearchText:searchString                                 scope:[[self.searchDisplayController.searchBar scopeButtonTitles]                                       objectAtIndex:[self.searchDisplayController.searchBar                                                      selectedScopeButtonIndex]]]; 

   return YES;

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller  shouldReloadTableForSearchScope:(NSInteger)searchOption {

   [self filterContentForSearchText:[self.searchDisplayController.searchBar text]                                 scope:[[self.searchDisplayController.searchBar scopeButtonTitles]                                       objectAtIndex:searchOption]]; 

   return YES;

}

运行工程,当你在搜索栏中点击及输入文本时,如下图所示:

UISearchDisplayController 点击搜索出现黑条问题解决方案
如果点击按钮启动 presentViewController 的时候出现下图效果:

比如说我这里现在代码式这样写的:

复制代码 代码如下:

AddFriendViewController *addFriendVC = [[AddFriendViewController alloc] init]; 
   UINavigationController *nav =[[UINavigationController alloc] initWithRootViewController:addFriendVC]; 
   [self presentViewController:nav animated:YES completion:nil]; 
   [addFriendVC release]; 
   [nav release]; 

发现问题所在 UINavigationController 的背景颜色是黑色的;
 
为了解决TableView点击搜索出现的黑条:

代码:

复制代码 代码如下:

AddFriendViewController *addFriendVC = [[AddFriendViewController alloc] init]; 
    UINavigationController *nav =[[UINavigationController alloc] initWithRootViewController:addFriendVC]; 
    [nav.view setBackgroundColor:UIColorFromRGB(0xC6C6CB)]; 
    [self presentViewController:nav animated:YES completion:nil]; 
    [addFriendVC release]; 
    [nav release]; 

改变了Nav的背景色:

复制代码 代码如下:

[nav.view setBackgroundColor:UIColorFromRGB(0xC6C6CB)];

效果:

时间: 2024-08-03 15:09:30

iOS应用中UISearchDisplayController搜索效果的用法_IOS的相关文章

详解iOS App中UiTabBarController组件的基本用法_IOS

UiTabBarController这个控制器绝对是项目架构时做常用的一个控件. 我们大致看下控件的效果,我们就知道为什么说他常见了. 这就是最简单的一个雏形,想必现在基本70%的应用界面结构都会是这样的. 在Android中我们以ActivityGroup或是现在的fragment来实现,一个容器中包含多个子控制器. 下面我们还是以建立xib文件的形式来实现一个这样的整体布局的例子. 当然在 xcode中我们会发现其实直接有这么一个模板了 但是直接使用模板后会发现是直接在代码里实现了子布局得添

IOS开发中NSURL的基本操作及用法详解_IOS

NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以封装一个NSURL,操作很方便. 1.URL URL是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它. URL可能包含远程服务器上的资源的位置,本地磁盘上的文件的路径,甚

iOS中sqlite数据库的原生用法_IOS

在iOS中,也同样支持sqlite.目前有很多第三方库,封装了sqlite操作,比如swift语言写的SQLite.swift.苹果官网也为我们封装了一个框架:CoreData. 它们都离不开Sqlite数据库的支持. 本文主要介绍下,如何在swift中使用原生的sqlite的API. 在Xcode中引入sqlite API 新建一个swift项目后,我们需要让项目引入sqlite的动态链接库: 1.项目配置界面,选择Build Phases 2.点开Link Binary With Libra

iOS仿微信添加标签效果(shape实现)_IOS

一. 概述 可以说微信做的用户体验太棒了,可以做到老少皆宜,给个赞,我们也同时应该告诫自己,用户体验应该向微信看齐,微信就是我们的标杆,那我们今天也来仿一仿微信添加的标签功能.只能仿着做了,真是做不到微信的那种体验.甘拜下风. 我们上篇学习了shape属性的用法,那我们今天就用shape来做下微信的标签功能.先看一下效果. 我不仅用到了shape属性,还用到了翔哥的标签布局FlowLayout跟TagFlowLayout鸿洋的博客 二.效果图 三 .定义shape 添加标签 <?xml vers

iOS实现爆炸的粒子效果示例代码_IOS

照例我们先看看效果图 怎么样?效果很不错吧,下面来一起看看实现的过程和代码示例. 实现原理 从图中可以大致看出,爆炸点点都是取的某坐标的颜色值,然后根据一些动画效果来完成的. 取色值 怎么取的view的某个点的颜色值呢?google一下,就可以找到很多答案.就不具体说了.创建1*1的位图,然后渲染到屏幕上,然后得到RGBA.我这里写的是UIView的extension. extension UIView { public func colorOfPoint(point:CGPoint) -> U

iOS开发中UIPopoverController的使用详解_IOS

一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤 (1)设置内容控制器 由于UIPopoverController直接继承自NSObject,不具备可视化的能力.因此UIPopover

深入讲解iOS开发中应用数据的存储方式_IOS

XML属性列表-plist 一.应用沙盒每个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应⽤必须待在⾃己的沙盒里,其他应用不能访问该沙盒(提示:在IOS8中已经开放访问) 应⽤沙盒的文件系统⽬录,如下图所示(假设应用的名称叫Layer) 模拟器应⽤用沙盒的根路径在: (apple是⽤用户名, 7.0是模拟器版本) /Users/apple/Library/Application Support/iPhone Simulator/7.0/Applications

解析iOS开发中的FirstResponder第一响应对象_IOS

1. UIResonder 对于C#里所有的控件(例如TextBox),都继承于Control类.而Control类的继承关系如 下: 复制代码 代码如下: System.Object   System.MarshalByRefObject     System.ComponentModel.Component       System.Windows.Forms.Control 对于iOS里的UI类,也有类似的继承关系. 例如对于UITextField,继承于UIControl:UIContr

ios开发中时间转换的方法集锦_IOS

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate d