iOS tableview实现简单搜索功能

本文实例为大家分享了tableview实现搜索功能的具体代码,供大家参考,具体内容如下

一、先用xcode创建好工程

通过xib文件来初始化视图控制器

二、编写代码

1、先为NSDictionary创建一个分类 实现字典的深拷贝

.h文件

#import <Foundation/Foundation.h>

@interface NSDictionary (MutableDeepCopy)

- (NSMutableDictionary *)mutableDeepCopy;
@end

.m文件

#import "NSDictionary+MutableDeepCopy.h"

@implementation NSDictionary (MutableDeepCopy)

- (NSMutableDictionary *)mutableDeepCopy
{
 NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithCapacity:[self count]]; //这里的容量也只是个参考值,表示对大小的限制 大小是调用该方法的count
 NSArray *keys = [self allKeys]; //self就是个可变的字典
 for(id key in keys)
 {
  id dicValue = [self valueForKey:key];
  //从 NSDictionary 取值的时候有两个方法objectForkey valueForKey
  id dicCopy = nil;
  if([dicValue respondsToSelector:@selector(mutableDeepCopy)])
  //如果对象没有响应mutabledeepcopy 就创建一个可变副本 dicValue 有没有实现这个方法
  {
   dicCopy = [dicValue mutableDeepCopy];
  }
  else if([dicValue respondsToSelector:@selector(mutableCopy)])
  {
   dicCopy = [dicValue mutableCopy];
  }
  if(dicCopy ==nil)
  {
   dicCopy = [dicValue copy];
  }
  [mutableDictionary setValue:dicCopy forKey:key];
 }
 return mutableDictionary;
}
@end

2、编写主代码

.h文件
NoteScanViewController.h

#import <UIKit/UIKit.h>

@interface NoteScanViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,UISearchBarDelegate>

@property (nonatomic,retain)NSMutableDictionary *words;
@property (nonatomic,retain)NSMutableArray *keys;
@property (weak, nonatomic) IBOutlet UITableView *table;
@property (weak, nonatomic) IBOutlet UISearchBar *search;

@property (nonatomic,retain)NSDictionary *allWords;
- (void)resetSearch;
- (void)handleSearchForTerm:(NSString *)searchTerm;

@end

.m文件

#import "NoteScanViewController.h"
#import "NSDictionary+MutableDeepCopy.h"
@interface NoteScanViewController ()

@end

@implementation NoteScanViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
 if (self) {
  // Custom initialization
 }
 return self;
}

- (void)viewDidLoad //只在第一次加载视图调用
{
 [super viewDidLoad];
 /*加载plist文件*/
 NSString *wordsPath = [[NSBundle mainBundle]pathForResource:@"NoteSection" ofType:@"plist"];//得到属性列表的路径
 NSDictionary *dictionary = [[NSDictionary alloc]initWithContentsOfFile:wordsPath];
 self.allWords = dictionary;
 [self resetSearch]; //加载并填充words可变字典和keys数组

 _search.autocapitalizationType = UITextAutocapitalizationTypeNone;//不自动大写
 _search.autocorrectionType = UITextAutocorrectionTypeNo;//不自动纠错
}

//取消搜索或者改变搜索条件
- (void)resetSearch
{
 self.words = [self.allWords mutableDeepCopy]; //得到所有字典的副本 得到一个字典
 NSLog(@"所有字典 = %@",self.words);
 NSMutableArray *keyArray = [[NSMutableArray alloc]init];//创建一个可变数组
 [keyArray addObjectsFromArray:[[self.allWords allKeys]sortedArrayUsingSelector:@selector(compare:)]]; //用指定的selector对array的元素进行排序
 self.keys = keyArray; //将所有key 存到一个数组里面
 NSLog(@"所有key = %@",self.keys);
}
//实现搜索方法
- (void)handleSearchForTerm:(NSString *)searchTerm
{
 NSMutableArray *sectionsRemove = [[NSMutableArray alloc]init]; //创建一个数组存放我们所找到的空分区
 [self resetSearch];
 for(NSString *key in self.keys)//遍历所有的key
 {
  NSMutableArray *array = [_words valueForKey:key] ;  //得到当前键key的名称 数组
  NSMutableArray *toRemove = [[NSMutableArray alloc]init];//需要从words中删除的值 数组
  for(NSString *word in array) //实现搜索
  {
   if([word rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location == NSNotFound)//搜索时忽略大小写 把没有搜到的值 放到要删除的对象数组中去
    [toRemove addObject:word]; //把没有搜到的内容放到 toRemove中去
  }

  if([array count] == [toRemove count])//校对要删除的名称数组长度和名称数组长度是否相等
   [sectionsRemove addObject:key]; //相等 则整个分区组为空
  [array removeObjectsInArray:toRemove]; //否则 删除数组中所有与数组toRemove包含相同的元素
 }
 [self.keys removeObjectsInArray:sectionsRemove];// 删除整个key 也就是删除空分区,释放用来存储分区的数组,并重新加载table 这样就实现了搜索
 [_table reloadData];
}

- (void)viewWillAppear:(BOOL)animated //当使用Push或者prenset方式调用
{
}
//#pragma mark -
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
 return ([_keys count] >0)?[_keys count]:1; //搜索时可能会删除所有分区 则要保证要有一个分区
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 if([_keys count] == 0)
 {
  return 0;
 }
 NSString *key = [_keys objectAtIndex:section]; //得到第几组的key
 NSArray *wordSection = [_words objectForKey:key]; //得到这个key里面所有的元素
 return [wordSection count]; //返回元素的个数
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 NSUInteger section = [indexPath section]; //得到第几组
 NSUInteger row = [indexPath row]; //得到第几行
 NSString *key = [_keys objectAtIndex:section]; //得到第几组的key
 NSArray *wordSection = [_words objectForKey:key]; //得到这个key里面的所有元素
 static NSString *NoteSectionIdentifier = @"NoteSectionIdentifier";
 UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:NoteSectionIdentifier];
 if(cell == nil)
 {
  cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NoteSectionIdentifier];

 }
 cell.textLabel.text = [wordSection objectAtIndex:row];
 return cell;
}
//为每个分区指定一个标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
 if([_keys count] == 0)
  return @" ";
 NSString *key = [_keys objectAtIndex:section];
 return key;
}
//创建一个索引表
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
 return _keys;
}
#pragma mark - 

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 [_search resignFirstResponder]; //点击任意 cell都会取消键盘
 return indexPath;
}

#pragma mark-

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar //搜索button点击事件
{
 NSString *searchTerm = [searchBar text];
 [self handleSearchForTerm:searchTerm]; //搜索内容 删除words里面的空分区和不匹配内容
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{ //搜索内容随着输入及时地显示出来
 if([searchText length] == 0)
 {
  [self resetSearch];
  [_table reloadData];
  return;
 }
 else
  [self handleSearchForTerm:searchText];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar //点击取消按钮
{
 _search.text = @""; //标题 为空
 [self resetSearch]; //重新 加载分类数据
 [_table reloadData];
 [searchBar resignFirstResponder]; //退出键盘

}
@end

运行结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码

    废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableViewCell.h" #define kDeviceWidth [UIScreen mainScreen].bounds.size.width #define kDeviceHeight [UIScreen mainScreen].bounds.

  • iOS tableView实现搜索功能

    本文实例为大家分享了tableView搜索功能的具体代码,供大家参考,具体内容如下 框架:https://github.com/honeycao/HCSortAndSearchDemo github里面有详细的说明 支持中文排序 #import "ChineseToPinyin.h" #import "HCSortString.h" #import "WLCCityTVC.h" #import "WLCProvinceModel.h&q

  • iOS tableview实现简单搜索功能

    本文实例为大家分享了tableview实现搜索功能的具体代码,供大家参考,具体内容如下 一.先用xcode创建好工程 通过xib文件来初始化视图控制器 二.编写代码 1.先为NSDictionary创建一个分类 实现字典的深拷贝 .h文件 #import <Foundation/Foundation.h> @interface NSDictionary (MutableDeepCopy) - (NSMutableDictionary *)mutableDeepCopy; @end .m文件 #

  • javascript实现简单搜索功能

    本文实例为大家分享了javascript实现简单搜索功能的具体代码,供大家参考,具体内容如下 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>New Web Project</title> <style> table{ width: 500px; } td{ bo

  • Django用内置方法实现简单搜索功能的方法

    Model中分别提供了filter方法和icontains方法实现简单的搜索功能. html页面中实现搜索框 模板api_test_manage.html中增加以下内容 <form method='get' action='/api_search/'> {% csrf_token %} <input type='search' name='api_test_name' placeholder='流程接口名称' required> <button type='submit'&g

  • IOS实现的简单画板功能

    效果图 设计要求 1.画笔能设置大小.颜色 2.有清屏.撤销.橡皮擦.导入照片功能 3.能将绘好的画面保存到相册 实现思路 1.画笔的实现,我们可以通过监听用户的 平移手势 中创建 UIBezierPath 来实现线条的绘制 2.撤销功能,我们先来看下撤销功能,我们会想到用一个数组队列将用户的每一次的笔画都加入到数组中,然后撤销的时候只需要将最后添加进去的笔画pop掉,重新绘制就可以了 3.清屏功能就简单了,只需要将上面说到的那个数组清空重新绘制下就可以了 4.导入照片功能,可以用系统的 UII

  • iOS开发实现简单计算器功能

    用Object-C写的一个简单的计算机程序,主要学习按钮的action动作. 下面是主界面: 下面代码时界面按钮和ViewController.h连接的地方: - (IBAction)button_0:(UIButton *)sender; - (IBAction)button_dian:(UIButton *)sender; - (IBAction)button_dengyu:(UIButton *)sender; - (IBAction)button_1:(UIButton *)sender

  • 微信小程序云开发实现搜索功能

    微信小程序云开发实现搜索功能,供大家参考,具体内容如下 微信小程序使用云开发实现搜索功能有两种情况,一种是简单的搜索用关键字来查询数据,另一种是模糊查询关于关键字的全部数据查询.废话不用多说直接上代码部分. 简单搜索功能实现 WXML代码段 <view class="sousuokuang">     <view class="sousuo">         <view class="shurukuang">

  • iOS 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能

    注:CSDN的代码块有点捞,如果浏览器窗口较窄,一行代码占了两行的位置,后面的代码就看不到了,大家可以把浏览器窗口拉大一点 UI小姐姐设计的搜索框经常是五花八门,系统的搜索框经常不能满足我们的需求,需要我们特别定制一个.但是UITextField的诸多回调里面,没有一个是适合触发搜索时间的. UITextFieldTextDidChangeNotification调用过于频繁,每输入一个字符就调一次接口怕是不太合适. UITextFieldTextDidEndEditingNotificatio

  • jQuery实现的简单前端搜索功能示例

    本文实例讲述了jQuery实现的简单前端搜索功能.分享给大家供大家参考,具体如下: html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>工程轻量化与可靠性技术实验室</title> </head> <body> <div class="content-r

  • Python实现简单的索引排序与搜索功能

    今天,我上的课,学了索引排序与搜索.让我们用Python实现,觉得有点意思就跟大家分享一波. 代码如下图: import requests import re def News_Spider():#定义一个爬虫 url = 'https://news.sina.com.cn/'#url地址,新浪新闻 headers = {#请求头 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like

随机推荐