ContactsService.h代码

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
//block返回选中的通讯里名字和电话
typedef void(^ChoseContacts)(NSString *name,NSString *phone);
@interface ContactsService : NSObject
@property(nonatomic,copy)ChoseContacts contacts;
/*
单例
*/
+(ContactsService *)sharedContactsService;
/**
打开系统通讯录
*/
-(void)showContactsServiceWithVC:(UIViewController *)nav; @end

ContactsService.m代码

#import "ContactsService.h"
#import <ContactsUI/ContactsUI.h>
@interface ContactsService ()<CNContactPickerDelegate>
{
CNContactPickerViewController *_contactPickerViewController;
}
@end @implementation ContactsService
static ContactsService *contacts; +(ContactsService *)sharedContactsService{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
contacts = [ContactsService new];
});
return contacts;
} -(void)showContactsServiceWithVC:(UIViewController *)nav{
_contactPickerViewController = [[CNContactPickerViewController alloc] init];
_contactPickerViewController.delegate = self; [nav presentViewController:_contactPickerViewController animated:YES completion:nil];
} // 如果实现该方法当选中联系人时就不会再出现联系人详情界面, 如果需要看到联系人详情界面只能不实现这个方法,
#pragma mark CNContactPickerDelegate
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact {
[self printContactInfo:contact];
[_contactPickerViewController dismissViewControllerAnimated:YES completion:nil];
}
- (void)contactPickerDidCancel:(CNContactPickerViewController *)picker{
[_contactPickerViewController dismissViewControllerAnimated:YES completion:nil];
} - (void)printContactInfo:(CNContact *)contact {
NSString *givenName = contact.givenName;
NSString *familyName = contact.familyName;
//NSLog(@"givenName=%@, familyName=%@", givenName, familyName);
NSArray * phoneNumbers = contact.phoneNumbers;
for (CNLabeledValue<CNPhoneNumber*>*phone in phoneNumbers) {
// NSString *label = phone.label;
CNPhoneNumber *phonNumber = (CNPhoneNumber *)phone.value;
// NSLog(@"label=%@, value=%@", label, phonNumber.stringValue);
if(self.contacts){
self.contacts([NSString stringWithFormat:@"%@%@",familyName,givenName], phonNumber.stringValue);
}
break;
}
}
@end

使用:

 ContactsService *contacts = [ContactsService sharedContactsService];
contacts.contacts = ^(NSString *name, NSString *phone) {
NSString *str = [NSString stringWithFormat:@"选中的名字:%@ 电话:%@",name,phone];
UIAlertView *aler = [[UIAlertView alloc]initWithTitle:@"通讯里" message:str delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[aler show];
};
[contacts showContactsServiceWithVC:self];

OC通讯录选择封装的更多相关文章

  1. OC - 30.如何封装自定义布局

    概述 对于经常使用的控件或类,通常将其分装为一个单独的类来供外界使用,以此达到事半功倍的效果 由于分装的类不依赖于其他的类,所以若要使用该类,可直接将该类拖进项目文件即可 在进行分装的时候,通常需要用 ...

  2. OC - 31.通过封装的自定义布局快速实现商品展示

    概述 实现效果 设计思路 采用MVC架构,即模型—视图-控制器架构 使用MJExtension框架实现字典转模型 使用MJRefresh框架实现上拉和下拉刷新 上拉刷新,加载新的数据 下拉刷新,加载更 ...

  3. OC对象:封装、继承、多态的使用举例一

    // 该代码在网上找的视频中的例子,感觉很适合类和对象分不清楚的同学参考,仅供学习分享,谢谢 // 创建一个Pointtest类,用属性x.y表示点的坐标位置,求两点之间的距离,使用两种方法:类方法和 ...

  4. OC第二天—封装

    /.锁定头文件的方法 1. 打开终端 2. 进入到Xcode的目录, 命令:   cd /Applications/Xcode.app 3. 把系统头文件修改为只读, 命令:   sudo chown ...

  5. IOS开发-封装数据库sqlite3之为何选择FMDB

    为什么使用第三方轻量级框架FMDB? FMDB是用于进行数据存储的第三方的框架,它与SQLite与Core Data相比较,存在很多优势. FMDB是面向对象的,它以OC的方式封装了SQLite的C语 ...

  6. O-C相关05:方法的封装.

    前言:在 OC 中进行封装, 就是实现设置实例变量和获取实例变量数据的方法, 常常称为 setter 方法和 getter 方法. 或称为 get set 读写器. 1,setter 方法 sette ...

  7. iOS通讯录整合,兼容iOS789写法,附demo

    苹果的通讯录功能在iOS7,iOS8,iOS9 都有着一定的不同,iOS7和8用的是 <AddressBookUI/AddressBookUI.h> ,但是两个系统版本的代理方法有一些变化 ...

  8. 21 (OC) 数据持久化

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  9. c++实现通讯录管理系统(控制台版)

    c++实现通讯录管理系统(控制台版) 此项目适合c++初学者,针对c++基础知识,涉及到变量.结构体定义使用.数组定义使用.指针定义使用等. 运行之后的结果如下: 代码: #include <i ...

随机推荐

  1. [Full-stack] 异步即时通信 - Async

    故事背景 socket.io, node.js, koa为首的一些通信框架和后端技术点. 之后有必要过一遍<NodeJS 设计模式>. 基础概念 一.短轮询.长轮询(comet).长连接( ...

  2. [Laravel] 02 - Route and MVC

    前言 一.良心资料 英文 Laravel 框架:https://laravel.com/ 教程:https://laracasts.com/series/ laravel-from-scratch-2 ...

  3. 微信jssdk上传图片,一张一张的上传 和 一次性传好几张

    //html模板 <div class="zhaopin_3_2"> <div id="bbb"></div> <im ...

  4. [No000010D]Git6/9-分支管理

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...

  5. 利用Python的collections包下Counter的类统计每个数据出现的个数

    from collections import Counter a = [1, 2, 3, 1, 1, 2] result = Counter(a) print result 输出: {1: 3, 2 ...

  6. Scss基础用法

    Scss基础用法 一.注释用法: (1)//comment:该注释只是在.scss源文件中有,编译后的css文件中没有. (2)/! /:重要注释,任何style的css文件中都会有,一般放置css文 ...

  7. block diagonal matrix 直和 块对角矩阵 不完美 有缺陷 缩放 射影几何

    小结: 1.block diagonal matrix  直和 块对角矩阵 A block diagonal matrix is a block matrix that is a square mat ...

  8. PE/ELF文件里面存的是什么呢?

    malloc分配的空间是连续的吗?PE/ELF文件里面存的是什么呢?

  9. C内存模型

    C语言中内存分布及程序运行中(BSS段.数据段.代码段.堆栈) - 秦宝艳的个人页面 - 开源中国 https://my.oschina.net/pollybl1255/blog/140323

  10. PHP之伪类型与变量

    本文档中使用的伪类型与变量 伪类型(pseudo -types)是PHP文档里用于指示参数可以使用的类型和值, 请注意,它们不是PHP语言里原生类型, 所以不能把伪类型用于自定义函数里面的类型约束(t ...