iOS开发-------简单通讯录2(UISearchController)

仿IOS通讯录效果,实现获取手机通讯录、字母排序显示、搜索联系人、拨打电话 1.使用UITableView,实现联系人字母排序、点击字母跳转显示联系人组目录; 2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人; 3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话; 4.实现获取手机通讯录里面的联系人信息; 阅读详情

       一般的通讯录不只是前面一篇文章中那么简单,查询自然不能少,那么查询如何完成呢,这里就需要了UISearchController 组件,在大约一年前,也就是iOS8之前,用的组件是一个叫做 UISearchDisplayController 的组件, 但是在iOS8之后,苹果就重新制作了,推荐用 UISearchController ,先给大家看一下示例图


很简单,首先,需要在我们的ContactTVController中添加一个属性

@property (nonatomic, strong) UISearchController * searchController;

然后需要设置一下searchController,是需要在viewDidLoad中设置,为了方便查看,楼主是打包成方法,所以需要在viewDidLoad中调用一下该方法

/**
 *  加载SearchController
 */
-(void)loadMySearchController
{
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];//因为是通过自身的tableView来实现显示,所以最后的Controller为nil,如果需要其他的tableView来实现,需要是那个tableView的Controller
    
    //添加搜索栏
    self.searchController.searchBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
    self.tableView.tableHeaderView = self.searchController.searchBar;
    
    //这是搜索的代理
    self.searchController.delegate = self;
    self.searchController.searchResultsUpdater = self;
    
    //搜索时背景不暗淡
    self.searchController.dimsBackgroundDuringPresentation = NO;
    
}

然后就是实现协议了,但是这个协议不是delegate协议,也不是我们常用的data source方法,而是叫做UISearchResultsUpdating的协议,实现方法如下

#pragma mark - UISearchResultsUpdating 协议
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController//是当searbar的搜索栏有变化时,就会调用这个方法,依旧用FRC来实现tableView的刷新
{
    //获取输入搜索的内容
    NSString * text = self.searchController.searchBar.text;
    
    //创建请求
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"People"];
    
    //创建排序器
    NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey:@"firstWord" ascending:YES];
    [request setSortDescriptors:@[descriptor]];
    
    //创建谓词
    NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name contains %@",text];
    [request setPredicate:predicate];
    
    //初始化fetchResulteController
    self.fetchResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:self.mangaedOjectContext sectionNameKeyPath:@"firstWord" cacheName:nil];
    
    //执行
    NSError * error;
    if (![self.fetchResultsController performFetch:&error])
    {
        NSLog(@"%@",[error localizedDescription]);
    }
    
    //刷新当前tableView
    [self.tableView reloadData];

    
}

然后需要实现UISearchControllerDelegate方法,这个方法中有四个,如下,相信看英文也能明白这个意思

- (void)willPresentSearchController:(UISearchController *)searchController;
- (void)didPresentSearchController:(UISearchController *)searchController;
- (void)willDismissSearchController:(UISearchController *)searchController;
- (void)didDismissSearchController:(UISearchController *)searchController;

因为点击cancle之后,我们会dismiss到tableView,所以我们需要把self.fetchedResultsController和tableView刷新一下,代码如下

/**
 *  搜索栏已经消失后
 *
 *  @param searchController 当前 searchController
 */
- (void)didDismissSearchController:(UISearchController *)searchController
{

    //重新设置fetchResultsController的属性
    [self loadMyFetchResultsController];
    
    //刷新当前的tableView
    [self.tableView reloadData];

}

这样基本就实现了如下功能:




那么我们右边的小标题栏如何实现呢,这个也很简单,只需要实现tableView的一个协议方法,代码如下:

/**
 *  为tableView 添加侧栏
 *
 *  @param tableView 当前tableView
 *
 *  @return 侧栏数组
 */
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    NSArray * sections = [self.fetchResultsController sections];//获取所有的组
    NSMutableArray * titles = [NSMutableArray array];//用来存储组名的数据
    
    for (id section in sections)//开始便利
    {
        [titles addObject:[section name]];
    }
    
    //返回侧栏的数组
    return titles;
}

这样就有了左边的小标题。


相比于上一篇,我们的数据类也发生了相应的变化,在属性方法我们多了一个名字叫做firstWord的NSString的类型属性,为了封装,所以把首字母的处理方法放到了类里面,代码如下

-(void)setPeopleInfoName:(NSString *)name Tele:(NSString *)tele Address:(NSString *)address Image:(UIImage *)image
{
    self.name = name;
    self.tele = tele;
    self.address = address;
    self.image = UIImagePNGRepresentation(image);
    [self loadFirstWord];

}


//设置首字母
-(void)loadFirstWord
{
    //设置首字母
    if (![self.name isEqualToString:@""])
    {
        self.firstWord = [NSString stringWithFormat:@"%c",pinyinFirstLetter([self.name characterAtIndex:0]) - 32];
    }
    
    else
    {
        self.firstWord = @"#";
    }
}

       这样,我们的功能基本就实现了,大体上感觉searchController在修改后,会比以前用的更加方便。

       以上描述是个人的理解,如果有什么错误,也请告知,不要再误导更多的人。3Q


ios 操作通讯录联系人demo大全 立即下载

相关推荐

从智能手机到汽车电子:聊聊IPC-9702/9704A标准如何帮我们搞定不同场景下的PCB可靠性设计

本文探讨了IPC-9702/9704A标准在智能手机和汽车电子等不同场景下的PCB可靠性设计应用。通过分析消费电子、汽车电子和工业设备中的应力特征,详细解读了IPC标准在应变识别和测试方法论中的核心价值,并提供了具体的轻量化设计策略和全生命周期验证方案,帮助工程师提升PCB的长期可靠性。

weixin_30693683的博客 279

【iOS】—— 浅谈UISearchController

UISearchController是iOS的一个系统的搜索控件,在平时我们输入信息的时候会出现相应的联想搜索的内容,然后通过UITableView展示到搜索框的下面,供我们选择。原本还想用UITextField来实现这个功能,人家现在有,那就浅学习一手。 一、需要遵守的协议: 因为它用到的UITableView所以一定是要用到UITableViewDelegate, UITableViewDataSource的,另外我们要实现其联想搜索功能还的遵守这两个协议UISearchControllerDelega

m0_55124878的博客 2198

Intel Arc显卡玩《三角洲行动》报错?手把手教你修改注册表跳过验证

本文针对Intel Arc显卡用户在运行《三角洲行动》时遇到的驱动验证报错问题,提供了详细的解决方案。通过安全修改Windows注册表,添加特定键值以跳过游戏驱动兼容性验证,并结合游戏内图形设置与Intel驱动面板的优化建议,旨在帮助玩家顺利进入游戏并提升游戏帧率与运行稳定性。

weixin_29310605的博客 695

iOS开发实战之搜索控制器UISearchController使用

当tableView中的数据过多的时候,在tableView上加一个搜索框就变的很必要了,本文就讨论搜索控制器的使用,以及谓词的简单实现。 .m文件中代码如下添加搜索控制器的各种协议 <UISearchBarDelegate,UISearchResultsUpdating,UIAlertViewDelegate> 创建两个实例和数据源 { NSArray * ...

weixin_30872337的博客 156

用友u8服务器优化,用友U8erp软件运行的性能优化方案图文教程

今天一定要给大家分享一下用友U8erp软件运行的性能优化方案图文教程,以下方案来自用友软件官方维护工程师反馈在在处理客户问题的时候,有一类问题较为挠头,就是诸如用友U8服务器效率低下的问题。比如用友U8运行慢,卡住等,我们暂先不提用友U8软件代码、脚本层面本身的性能提升问题,我们只是基于现有用友U8软件版本,在客户现有环境下排查用友U8软件运行的性能瓶颈,并采取一定的技术手段进行性能调校。本文将推...

weixin_39882870的博客 5306

【新华三】通过路由复制实现Public与VRF路由互通

如上图所示,S6900设备里有两张表,一张是public路由表,默认所有的路由都存放在public路由表里;除此之外还创建了VRF test,因此此设备还有VRF test路由表。通过路由复制实现Public路由和VRF路由互通,默认情况下VRF里的路由单独一张路由表,默认情况下与public路由表相互隔离,两张表之间不可互访。此时的public路由表里面并没有test的路由表。public路由表与VRF路由表之间相互隔离。此时VRF test里的路由也没有其他VRF或Public里的路由,相互隔离。

五大连池的镜子 5278

iOS之iPhone手机通讯录和短信搜索界面的实现以及UISearchController和UISearchDisplayController的浅析

本来觉得这个模块也就是一个SearchBar就搞定了,但是现在的产品经理也是够了,一会儿一个想法,之前的搜索 都已经写完了,类似主流的电商,好像也没那么麻烦,但是改版了总得弄点什么吧。嘿,哥们,我现在要iphone手机 通讯录里面搜索的样式,你搞定哦。。。。。。,要一毛一样哦。作为一个文化人,我只能在内心深处生 出表达出,苦逼的我们顶多发发牢骚,要改就改喽。 请看图先 这是他要的效

Deft_MKJing的博客 6608

R语言生存分析

自己整理编写的R语言常用数据分析模型的模板,原文件为Rmd格式,直接复制粘贴过来,作为个人学习笔记保存和分享。部分参考薛毅的《统计建模与R软件》和《R语言实战》生存分析是研究生存时间的分布规律,以及生存时间和相关因素之间关系的一种统计分析方法。生存分析在医学科学研究中具有广泛而重要的应用价值,它对人群寿命的研究,各种慢性疾病的现场追踪研究,临床疗效试验和动物试验等研究中随访资料的处理骑着举足轻重的作

Tiaaaaa的博客 2万+

ios开发 之 通讯录操作

在ios开发中,  通讯录操作还是比较常见的, 尤其是在社交项目中更为突出.  目前系统提供了两个框架对通讯录进行操作: 1. 兼容iOS9以前的框架 #import 2.iOS9以后的新框架 #import  为了项目能兼容老版本, 本文主要整理AddressBook>的使用: 一.  判断通讯录权限 /

曾治铭的博客 5321

空心杯电机在美容仪器中的应用:为什么你的洗脸刷动力这么强?

本文深入解析了空心杯电机如何成为高端美容仪器的核心动力源。通过对比传统电机,揭示了其无铁芯、低惯量、零齿槽效应的技术优势,从而实现了强劲动力、极致静音与细腻震动的用户体验。文章详细阐述了空心杯电机在洁面刷、导入仪等美容仪器中的具体应用与选型考量,并指出了开发中驱动匹配、测试等关键实战要点。

j2k3l4的博客 1013

【第24例】华为 IPD 体系 | RMT 需求管理团队

RMT需求管理团队

产品线负责人 1764

iOS通讯录

1.使用UITableView,实现联系人字母排序、点击字母跳转显示联系人组目录; 2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人; 3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话; 4.实现获取手机通讯录里面的联系人信息; 详情见资源:http://dow

super_man_ww的博客 1364

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2280

仿ios通讯录实现中的细节感悟

仿ios通讯录实现中的细节感悟,本人选择实现ios通讯录的基本功能,主要也是考虑到UITableView在各种应用程序中的普遍使用,同时也包含了UITableView的删除,移动等编辑功能,同时也包含plist文件解析,UISearchController的基本使用,也比较全面的实现了通讯录的基本功能。

wlaizff的专栏 3163

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

iOS - Swift UISearchController的取消按钮

UISearchController的取消按钮关于UISearchController的设置就不多说了,可以参考《UISearchController仿微信搜索框》或者自行上网查找。情况本人想实现微信通讯录上方的搜索框功能,但在搜索框的取消按钮的设置这个卡住,在网上搜了个遍,没有合适的做法,经过不懈的探索,终于找到解决方案,遂前来记录一下。方案添加两个属性// 记录是否已经找到取消按钮 l

LinXunFeng的博客 2278

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

UISearchController

#import "ViewController.h" @interface ViewController () <UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchControllerDelegate> { UIBarButtonItem *_editeBtn; ...

weixin_33896069的博客 74

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

iOS Swift UISearchController的取消按钮

UISearchController的取消按钮 关于UISearchController的设置就不多说了,可以参考《UISearchController仿微信搜索框》或者自行上网查找。 情况 本人想实现微信通讯录上方的搜索框功能,但在搜索框的取消按钮的设置这个卡住,在网上搜了个遍,没有合适的做法,经过不懈的探索,终于找到解决方案,遂前来记录一下。 方案 添加两个属性 // 记录是否已经找到取消按钮...

weixin_33857679的博客 319

仿趣头条获取系统通讯录,并自定义通讯录界面

我们有个项目 需求要做一个方趣头条的获取通讯录的要求,在此期间,对搜索栏和边栏首字母检索,有些陌生,踩了一些坑。 先来看效果 首先是获取系统通讯录,在iOS9之后,iOS对通讯录的库有了很大的改善。用起来很方便,但是点要注意在引用 #import &lt;ContactsUI/ContactsUI.h&gt; #import &lt;Contacts/Contacts.h&gt; 这两个库的时候,...

weixin_43883776的博客 1932

iOS8的一些控件的变更

UISearchDisplayController变更为UISearchController UIAlertView变更为UIAlertController 如果添加点击事件则需要使用UIAlertController其中的- (void)addAction:(UIAlertAction *)action; 那么其中的UIAlertAction则需要添加相应的事件即可 继续示例如下   ...

weixin_33681778的博客 108

iOS搜索框

1. UISearchBar 是UIKit提供的最简单,底层的一个控件,创建它: UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 44)]; searchBar.delegate=self; [self.view addS...

weixin_30457551的博客 82

类似微信的通讯录搜索

一,在当前界面实现搜索功能 使用UISearchController ,在.m文件中调用以下方法 1.设置属性@interface FriendViewController ()<UITableViewDelegate,UITableViewDataSource,UISearchResultsUpdating,UISearchControllerDelegate> { UITableVi

1105

环信---通讯录集成

1.使用NSUserdefault存储通讯录中的好友信息 NSUserDefault为访问普通类型的变量提供便利 (float int,bool)一个默认对象必须有一个属性列表是(NSData、NSdate、NSString、NSArray、NSDictionnary、NSNumeber)的实例,如果是其他类型的对象,想要存储的话必须把它转化成一个NSData的实例,这个自定义对象只有...

diduo7077的博客 202

通讯录 CoreData & tabelView

数据持久化的增删改查 通过 FRC 和 CoreData 动态刷新tabelView 数据 #import "ViewController.h" #import "Person.h" @interface ViewController ()UISearchResultsUpdating,UISearchControllerDelegate,NSFetchedResult

better_dong的博客 505

iOS13 中UISearchController用法

这里写目录标题iOS13 中UISearchController用法背景直接上代码插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 iOS13 中UISearchControlle...

qq_45039822的博客 1205

iOS简单通讯录

// // Contact.h // contactDemo // // Created by laouhn on 15/10/26. // Copyright (c) 2015年 laouhn. All rights reserved. //#import <Foundation/Foundation.h>@interface Contact : NSObject //姓名 @proper

w1035524412的博客 854
上一篇: iOS开发-------简单通讯录(UITableView和CoreData的应用)
下一篇: Objective-C学习-数组排序问题
RITL
博客等级 码龄11年 69粉丝 77原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值