//
//  AddressBookViewController.m
//  UIfont
//
//  Created by iOS Developer on 15/8/10.
//  Copyright (c) 2015年 iOS Developer. All rights reserved.
//#import "AddressBookViewController.h"
#import <AddressBook/AddressBook.h> //首先要包含通讯录类头文件
#import <AddressBookUI/AddressBookUI.h>@interface AddressBookViewController ()<UITableViewDataSource,UITableViewDelegate>@property(nonatomic,retain)NSMutableArray *dataArr;//Table数据源@end@implementation AddressBookViewController-(void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:animated];[self addressBookAgree];//先进行授权的判断
}- (void)viewDidLoad
{[super viewDidLoad];self.automaticallyAdjustsScrollViewInsets = NO;//iOS7才有的VIewcontroller的新增属性,放到末尾介绍self.dataArr = [NSMutableArray arrayWithCapacity:0];//为数据源开辟空间,NSMutable的对象只能用Capacity,//创建一个TableViewUITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, 320, self.view.frame.size.height-64-49) style:UITableViewStylePlain];table.dataSource = self;table.delegate = self;//实现Table的代理[self.view addSubview:table];table.tag = 6666;
}-(void)addressBookAgree
{NSLog(@"eadfas");ABAddressBookRef addressBook = nil;//实例化通讯录对象if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)//判断设备版本,因为在iOS好多想的方法规则都进行了升级{addressBook = ABAddressBookCreateWithOptions(NULL, NULL);//访问通讯录方法,执行时进行授权判定//等待用户同意后向下执行dispatch_semaphore_t sema = dispatch_semaphore_create(0);ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);}else{addressBook = ABAddressBookCreate();//这个方法在ios6以后被弃用了}//上面部分是请求通讯录的标准,可直接用,在iOS7就要提示用户 已经禁用了这个权限,if(ABAddressBookGetAuthorizationStatus() == 1 || ABAddressBookGetAuthorizationStatus() == 2){//判断通讯隐私目前状态,1和2表示禁止访问,进行提示UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"有个提醒"message:@"你已经禁止访问通讯录,请在设置中_隐私_通讯中开启我的权限"delegate:selfcancelButtonTitle:@"好的!"otherButtonTitles:nil, nil];[alert show];return;}[self loadAddress:addressBook];//调用下面打开取通讯录的方法
}-(void)loadAddress:(ABAddressBookRef)addressBook
{NSArray* tmpPeoples = (NSArray*)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));//在通讯录获取所有联系人的全部信息for(id tmpPerson in tmpPeoples){//遍历联系人,tempPerson就是一个联系人//单项取出属性,关键字ABRecordCopyValue//获取的联系人单一属性:First name,第一个参数固定就是联系人,第二个参数是要取得值NSString* tmpFirstName = (NSString*)CFBridgingRelease(ABRecordCopyValue(CFBridgingRetain(tmpPerson), kABPersonFirstNameProperty));NSString *lastName = (NSString*)CFBridgingRelease(ABRecordCopyValue(CFBridgingRetain(tmpPerson), kABPersonLastNameProperty));NSLog(@"%@.%@",tmpFirstName,lastName);//多项取出属性,关键字还是ABRecordCopyValue,但是这次取出来的是一整个项,比如下面取出来的是kABPersonPhoneProperty所对应的联系人电话这个项ABMultiValueRef phonesArr = ABRecordCopyValue(CFBridgingRetain(tmpPerson), kABPersonPhoneProperty);//获取的联系人多项属性:Generic phone numberNSMutableArray *tempPhoneArr = [NSMutableArray arrayWithCapacity:0];for(NSInteger j = 0; j < ABMultiValueGetCount(phonesArr); j++){ABMultiValueGetCount计算ABMultiValueRef对象的长度,一个联系人的电话项里存了几个电话,就会循环几次//获得多项中某一项的具体数据,关键字是ABMultiValueCopyValueAtIndex,第一个参数固定就是上面取回来的这个项的数组,第二个参数是下标NSString* phoneNum = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(phonesArr, j));//根据索引获取每一位的电话号码//获得多项中某一项的具体类型,关键字是ABAddressBookCopyLocalizedLabel,第一个参数还是项的数组,第二个参数是下标NSString* phoneType = (NSString*)CFBridgingRelease(ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phonesArr, j)));//根据索引获取每一位的电话类型[tempPhoneArr addObject:[NSString stringWithFormat:@"%@:%@",phoneType,phoneNum]];//循环多次向这个电话数组中存所有的电话}[self.dataArr addObject:@{@"name":[NSString stringWithFormat:@"%@%@",lastName,tmpFirstName],@"phones":tempPhoneArr}];//拼出当前这次大循环这个联系人的名字和电话们//找到邮箱 kABPersonEmailPropertyABMultiValueRef emailArr = ABRecordCopyValue(CFBridgingRetain(tmpPerson), kABPersonEmailProperty);for(NSInteger j = 0; j < ABMultiValueGetCount(emailArr); j++){NSString* phoneNum = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(emailArr, j));NSString* phoneType = (NSString*)CFBridgingRelease(ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(emailArr, j)));NSLog(@"%@:%@",phoneType,phoneNum);}CFRelease(phonesArr);CFRelease(emailArr);}//出了找人的循环后,所有联系人的数据都OkUITableView *table = (UITableView*)[self.view viewWithTag:6666];[table reloadData];
}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return self.dataArr.count;
}-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Address"];if(cell == nil){cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Address"];}cell.textLabel.text = self.dataArr[indexPath.row][@"name"];cell.detailTextLabel.text = ((NSArray*)self.dataArr[indexPath.row][@"phones"]).count >0? self.dataArr[indexPath.row][@"phones"][0]:@"NUll";return cell;
}@end

补充:

iOS 7 viewcontroller新增属性automaticallyAdjustsScrollViewInsets,即是否根据按所在界面的navigationbar与tabbar的高度,自动调整scrollview的 inset,此属性默认为YES,这样UIViewController下如果只有一个UIScollView或者其子类,那么会自动留出空白,让scollview滚动经过各种bar下面时能隐约看到内容。但是每个UIViewController只能有唯一一个UIScollView或者其子类,如果超过一个,需要将此属性设置为NO,自己去控制留白以及坐标问题。

OC_AddressBook_通讯录相关推荐

  1. c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享

    #include #include #include #include #include #pragma warning (disable:4996) enum Contact //枚举变量 { Qu ...

  2. c语言个人通讯录管理系统实验报告_C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include ...

  3. c++小项目:通讯录管理系统

    该项目非常适合新手c++的同学来做(当然也包括我),先看一个通讯录管理系统需要写什么东西. 学习于:https://www.bilibili.com/video/BV1et411b73Z?p=75(自 ...

  4. python 全栈开发,Day132(玩具管理页面,控制玩具通讯录,基于请求的好友关系建立)...

    先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.5.zip 注意:由于涉及到 ...

  5. 两个苹果手机怎么传通讯录_苹果手机通讯录丢失怎么恢复?货真价实的通讯录恢复技巧...

    苹果手机如果只是误删了某个好友的联系方式,完全可以通过其他共同好友要到联系方式,重新添加回手机.如果没有共同好友,或者将手机通讯录所有联系人丢失或误删,该怎么办呢?今天小编就教大家几种找回误删通讯录联 ...

  6. 样式集(六)仿微信通讯录样式

    效果图: 这里有引用到 自定义底部导航,自定义底部导航组件链接 <!--pages/chatList/chatList.wxml--><!-- <include src=&qu ...

  7. iOS从通讯录中选择联系人

    有时候APP需要用户输入一位联系人的姓名和电话,除了用户手动输入,一般也允许用户从通讯录中选择一位联系人(图1),下面的代码就是使用系统的<AddressBookUI/AddressBookUI ...

  8. .NET 程序设计实验 含记事本通讯录代码

    实验一  .NET 程序设计基本流程 [实验内容] 一.控制台.Windows 应用程序.ASP.NET 程序开发流程 1.熟悉开发平台 2.分别开发控制台.Windows 应用程序.ASP.NET ...

  9. 关于IOS获取本地通讯录信息(包含iOS9.0前后)

    在ios开发当中,获取用户本地的通讯录功能愈加频繁的出现,七两自己也在自己公司的项目当中遇到的获取本地的通讯录信息的功能(俗称"种子用户功能",太可怕了).对此七两总结了自己使用本 ...

  10. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

最新文章

  1. 读后感与机翻《人类因果学习的分解:自下而上的联想学习和自上而下的图式推理》
  2. 34补1-2_3 HA Cluster基础及heartbeat实现HA
  3. 算法系列【希尔排序】篇
  4. postman response json 格式化_postman第7讲-核心功能六:Tests(断言)
  5. 组合CPU和DRAM
  6. linux运维选择题,初学Linux练习题
  7. 广数系统u盘支持什么格式_u盘装系统,u盘要格式化成什么格式
  8. pycharm、idea换一种思路---延长试用(无限使用30天)
  9. condition_variable_any
  10. python获取文件修改时间与创建时间
  11. Zookeeper概念介绍
  12. java selector wakeup_Selector
  13. 2022年的PMP考试大纲是什么?
  14. C# winform 如何让TextBox文本内容垂直居中?
  15. iOS 人脸识别功能
  16. 张锋因何错过诺贝尔化学奖?
  17. 计算机技术对人脸识别的作用,人脸识别技术有什么功能特点
  18. 考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第四课欧氏空间
  19. android机器人酷炫壁纸,机器人秀app下载
  20. PDF文件如何在线翻译成中文

热门文章

  1. html5黑色主题登录网页,永恒经典 18个黑白灰配色的网页设计作品
  2. 续费Enom域名的三种办法
  3. ubuntu系统备份、系统镜像制作教程
  4. 高考作文《细雨闲花》
  5. VS 2015 设置为透明主题
  6. 吴裕雄--天生自然 诗经:临江仙·滚滚长江东逝水
  7. Doom3 couldn't load default.cfg
  8. HDS NAS原理及Storage Pool方案
  9. 支付宝支付 接口配置
  10. 建立centos6的yum源服务器