iOS 学习 - 14.本地联系人
苹果在iOS9的SDK中废除了AddressBookUI.framework的一些功能(是不是这个库都废除了,有待验证),具体和保存联系人相关的几个系统界面如下:
联系人选择:AddressBookUI/ABPeoplePickerNavigationController.h
联系人详情:AddressBookUI/ABPersonViewController.h
未知联系人:AddressBookUI/ABUnknownPersonViewController.h
新建联系人:AddressBookUI/ABNewPersonViewController.h
新的SDK中使用
联系人选择:ContactsUI/CNContactPickerViewController.h
联系人详情、新建联系人、未知联系人:ContactsUI/CNContactViewController.h(使用不同方法创建,下面会说)
下面的例子,仍存在问题
1.UINavgationController 标题、左右 item 都是系统自带的,联系人详情的时候,navgationItem 的返回按钮无点击事件,应该怎么自定义?
2.联系人 logo 拍照黑屏(真机测试已获取权限),待解决
#import "ViewController.h"
#import <ContactsUI/CNContactPickerViewController.h>
#import <ContactsUI/CNContactViewController.h>
@interface ViewController ()<CNContactViewControllerDelegate,CNContactPickerDelegate> @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
} - (IBAction)Click:(id)sender {
[self set1];
}
//保存新联系人
-(void)set{
//1.创建 Contact 对象,必须是可变的
CNMutableContact *contact = [[CNMutableContact alloc]init];
//2.为 contact 赋值
[self setValue4Contact:contact existContect:NO];
//3.创建新建好友页面
CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:contact];
controller.delegate = self; UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
[self presentViewController:nav animated:YES completion:nil];
} //保存现有联系人
-(void)set1{
//跳转到联系人选择页面,注意这里没有使用 UINavgationController
CNContactPickerViewController *picker = [[CNContactPickerViewController alloc]init];
picker.delegate = self;
[self presentViewController:picker animated:YES completion:nil];
} //实现点选的代理,其他代理方法根据自己需求实现
-(void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{ [picker dismissViewControllerAnimated:YES completion:^{
// copy 一份可写的 contact 对象,不要尝试 alloc 一类,mutableCopy 独此一家
CNMutableContact *c = [contact mutableCopy];
//为 contact 赋值
[self setValue4Contact:c existContect:YES];
//跳转到新建联系人页面
CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:c];
controller.delegate = self;
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller]; [self presentViewController:nav animated:YES completion:nil]; }];
}
//设置要保存的 contact 对象
- (void)setValue4Contact:(CNMutableContact *)contact existContect:(BOOL)exist{
if (!exist) {
//名字和头像
contact.nickname = @"oriccheng";
/*
UIImage *logo = [UIImage imageNamed:@""];
NSData *dataRef = UIImagePNGRepresentation(logo);
contact.imageData = dataRef; */
}
CNLabeledValue *phoneNumber = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMobile value:[CNPhoneNumber phoneNumberWithStringValue:@""]];
if (!exist) {
contact.phoneNumbers = @[phoneNumber];
}else{
//现有联系人情况
if ([contact.phoneNumbers count] > ) {
NSMutableArray *phoneNumbers = [[NSMutableArray alloc]initWithArray:contact.phoneNumbers];
[phoneNumbers addObject:phoneNumber];
contact.phoneNumbers = phoneNumbers;
}else{
contact.phoneNumbers = @[phoneNumber];
}
}
//网址:CNLabeledValue *url = [CNLabeledValue labeledValueWithLabel:@"" value:@""];
//邮箱:CNLabeledValue *mail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:self.poiData4Save.mail]; //特别说一个地址,PostalAddress 对应的才是地址
CNMutablePostalAddress *address = [[CNMutablePostalAddress alloc]init];
address.state = @"江苏省";
address.city = @"南京市";
address.postalCode = @"";
address.street = @"新街口王八街18号";
//生成的上面直至的 CNLabeledValue,其中可以设置类型 CNLabelWork 等等
CNLabeledValue *addressLabel = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:address];
if (!exist) {
contact.postalAddresses = @[addressLabel];
}else{
if (contact.postalAddresses.count > ) {
NSMutableArray *addresses = [[NSMutableArray alloc]initWithArray:contact.postalAddresses];
[addresses addObject:addressLabel];
contact.postalAddresses = addresses;
}else{
contact.postalAddresses = @[addressLabel];
}
} }
iOS 学习 - 14.本地联系人的更多相关文章
- iOS学习14之OC NSNumber + NSValue
1.NSNumber 数值类. 作用:实现基本数据类型与OC对象类型的相互转化. 1> NSNumber创建对象 // 初始化方法 NSNumber *num1 = [[NSNumber all ...
- iOS中获取本地通讯录联系人以及汉字首字母排序
iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...
- iOS学习路线图
一.iOS学习路线图 二.iOS学习路线图--视频篇 阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天 学习后目标: ...
- 黑苹果-IOS学习的开始
深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ----- ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- IOS学习之IOS沙盒(sandbox)机制和文件操作
IOS学习之IOS沙盒(sandbox)机制和文件操作(一) 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都 ...
- iOS学习资料整理
视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...
- iOS 学习
iOS 学习资料 (适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解 ...
- iOS 学习资料汇总
(适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...
随机推荐
- 选择排序---堆排序算法(Javascript版)
堆排序分为两个过程: 1.建堆. 堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字. 堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序 ...
- PHP类和对象等代码说明
1.定义和创建类和对象: 定义类要使用class关键字.例如:class 类名{//属性和方法} 创建对象使用new关键字.例如: $p1 = new 类名;,可以基于一个类创建多个对象. 2. 类属 ...
- 根据日期查询access数据库
获取指定日期的记录 1.select Field1 from A where format("yyyy-MM-dd",Field1)=#2011-10-07# 有时不能获取记录 ...
- WinForm对话框
WinForm 对话框控件colorDialog - 颜色选择对话框 使用代码如下: private void 字体颜色ToolStripMenuItem_Click(object sender, E ...
- C# winform OpenFileDialog MessageBox
1.弹出窗体选择本地文件-OpenFileDialog OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Tit ...
- Liskov替换原则
一.定义 子类型必须能替换掉它们的基类型 二.提取公共部分的方法代替继承 如果一组类都支持一个公共的职责,那么它们应该从一个公共的超类继承该职责. 如果公共的超类不存在,那么就创建一个,并把公共的职责 ...
- Java总结篇系列:Java多线程(二)
本文承接上一篇文章<Java总结篇系列:Java多线程(一)>. 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型.下面分别看下引起Java线程阻塞的主要方法 ...
- mybaits 框架运用
支持普通 SQL 查询,存储过程和高级映射的ORM持久层框架.以一 个 SqlSessionFactory 对象的实例为核心. 从 XML 中构建 SqlSessionFactory configur ...
- C++/C互相调用
C调用C++: 在C++程序中使用extern "C"{}来明确要求C++编译器不要对被调用的C++函数进行换名处理, 当然,这会导致函数无法重载 C++调用C: 在C++程序中使 ...
- javaweb学习总结(十一)——使用Cookie进行会话管理
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...