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. 如何把大段文字转为带html标签的文字

    开发网页的时候,有时候会遇到大段的隐私声明,用户协议等等,我们呀要复制粘贴展示出来,必须加大量的p标签,h1,h2,空格符,br标签,这对我们来说无疑是泪崩的,有个很好的办法,可以快速给这些文字加标签 ...

  2. 【QT】QT下载与安装

    很简单 1.下载地址 http://download.qt.io/archive/qt/ 学个单词,archive. 选择一个版本下载,5.9.3. 2.安装 选择组件 MinGW就行了,MinGW- ...

  3. [PyData] 02 - Data Preprocessing and Cleaning

    From: DBWangGroup 基于该系列代码的实践与补充思考. 补充:特征工程 http://www.cnblogs.com/jasonfreak/category/823064.html  & ...

  4. SVN 命令行的使用

    大多数时候我们用TortoiseSVN作为客户端,其实SVN提供了强大的客户端命令行工具,和Git差不不多. 1. 查看工作副本修改的整体状况. $ svn status ? scratch.c A ...

  5. PHP实现敏感词过滤系统

    PHP实现敏感词过滤系统 安装说明 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html 安装PHP扩展 swoole,安装教程 htt ...

  6. NIO相关概念之Buffer

    Buffer的定义: 概念上,缓冲区是包在一个对象内的基本数据元素数组.Buffer类相比一个简单数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中.Buffer类以及它专有的子类定义了一 ...

  7. 修改testtools框架,将测试结果显示用例注释名字

    在之前介绍的测试框架testtool中,发现测试结果中显示的都是测试用例的函数名,并没有将注释显示出来 这很不符合国人使用阿,没办法,自己动手来改改吧 首先,testtools是继承unittest的 ...

  8. D - Pagodas

    n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, l ...

  9. 网易云信&七鱼市场总监姜菡钰:实战解读增长黑客在B端业务的运用

    近些年 ,随着互联网的迅速崛起,“增长黑客”一词逐渐映入大众的眼帘,并成为了最热门的话题之一.从2018年开始,线上流量触达天花板,引流之争的激烈程度空前高涨,企业为了获得更多的关注,产品的比拼.流量 ...

  10. .net core中使用Type.GetType()从字符串获取类型遇到的问题

    问题背景是想在 appsettings.json 中动态配置依赖注入,依赖注入代码如下: services.AddSingleton(typeof(ISmsService), Type.GetType ...