【我就看看不说话】读取通讯录

2024-08-27 07:58
文章标签 通讯录 读取 看看 说话

本文主要是介绍【我就看看不说话】读取通讯录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


一、在工程中添加AddressBook.frameworkAddressBookUI.framework


二、获取通讯录


1、在infterface中定义数组并在init方法中初始化


NSMutableArray *addressBookTemp;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

    addressBookTemp = [NSMutableArray array];

}

2、定义一个model,用来存放通讯录中的各个属性

新建一个继承自NSObject的类,在.h



@interface TKAddressBook : NSObject {

    NSInteger sectionNumber;

    NSInteger recordID;

    NSString *name;

    NSString *email;

    NSString *tel;

}

@property NSInteger sectionNumber;

@property NSInteger recordID;

@property (nonatomic, retain) NSString *name;

@property (nonatomic, retain) NSString *email;

@property (nonatomic, retain) NSString *tel;


@end

.m文件中进行synthesize


@implementation TKAddressBook

@synthesize name, email, tel, recordID, sectionNumber;


@end

3、获取联系人


iOS6之后,获取通讯录需要获得权限



//新建一个通讯录类

ABAddressBookRef addressBooks = nil;


if([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)


{

    addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);

    

    //获取通讯录权限

    

    dispatch_semaphore_t sema = dispatch_semaphore_create(0);

    

    ABAddressBookRequestAccessWithCompletion(addressBooks, ^(boolgranted, CFErrorRef error){dispatch_semaphore_signal(sema);});

    

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

    

    dispatch_release(sema);

    

}


else


{

    addressBooks = ABAddressBookCreate();

    

}


//获取通讯录中的所有人

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);



//通讯录中人数

CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);


//循环,获取每个人的个人信息

for(NSInteger i = 0; i < nPeople; i++)

{

    //新建一个addressBook model

    TKAddressBook *addressBook = [[TKAddressBook alloc] init];

    //获取个人

    ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

    //获取个人名字

    CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);

    CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);

    CFStringRef abFullName = ABRecordCopyCompositeName(person);

    NSString *nameString = (__bridge NSString *)abName;

    NSString *lastNameString = (__bridge NSString *)abLastName;

    

    if((__bridge id)abFullName != nil) {

        nameString = (__bridge NSString *)abFullName;

    }else{

        if((__bridge id)abLastName != nil)

        {

            nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];

        }

    }

    addressBook.name = nameString;

    addressBook.recordID = (int)ABRecordGetRecordID(person);;

    

    ABPropertyID multiProperties[] = {

        kABPersonPhoneProperty,

        kABPersonEmailProperty

    };

    NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);

    for(NSInteger j = 0; j < multiPropertiesTotal; j++) {

        ABPropertyID property = multiProperties[j];

        ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);

        NSInteger valuesCount = 0;

        if(valuesRef != nil) valuesCount = ABMultiValueGetCount(valuesRef);

        

        if(valuesCount == 0) {

            CFRelease(valuesRef);

            continue;

        }

        //获取电话号码和email

        for(NSInteger k = 0; k < valuesCount; k++) {

            CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);

            switch(j) {

                case0: {// Phone number

                    addressBook.tel = (__bridge NSString*)value;

                    break;

                }

                case1: {// Email

                    addressBook.email = (__bridge NSString*)value;

                    break;

                }

            }

            CFRelease(value);

        }

        CFRelease(valuesRef);

    }

    //将个人信息添加到数组中,循环完成后addressBookTemp中包含所有联系人的信息

    [addressBookTemp addObject:addressBook];

    

    if(abName) CFRelease(abName);

        if(abLastName) CFRelease(abLastName);

            if(abFullName) CFRelease(abFullName);

                }

三、显示在table


//行数

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return1;

}


//列数

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return[addressBookTemp count];

}


//cell内容

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    

    NSString *cellIdentifier = @"ContactCell";

    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    

    if(cell == nil){

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

    }

    

    TKAddressBook *book = [addressBookTemp objectAtIndex:indexPath.row];

    

    cell.textLabel.text = book.name;

    

    cell.detailTextLabel.text = book.tel;

    

    returncell;

}

列表效果



这篇关于【我就看看不说话】读取通讯录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111090

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

ROS1 + Realsense d455 固件安装+读取rostopic数据

目录 安装固件(一定要匹配)ROS1 wrapper 安装方法Realsense SDK 安装方法Realsense Firmware 安装方法 修改roslaunch配置文件,打开双目图像和IMU数据其他坑点参考链接 安装固件(一定要匹配) 如果你是使用ROS1获取realsense数据的话,一定要注意,SDK, Firmware的版本不是越新越好!!,这是因为intel已经不

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

java读取resource/通过文件名获取文件类型

java读取resource java读取resource目录下文件的方法: 借助Guava库的Resource类 Resources.getResource("test.txt") 通过文件名获取文件类型 mongodb java

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

聊聊说话的习惯

1 在日常生活中,每个人都有固定的说话习惯。心理学研究表明,通过一个人的说话习惯,也可以分析出他的性格特点。对于每一个人来讲,说话习惯已经融为他们生活中的一部分。在社交活动中,一些不良的说话习惯很可能会给他们带来麻烦。因此,了解说话习惯对心理活动的影响是十分有必要的。 2 具有顺畅的说话习惯的人,大多思路清晰、语速适中、用词准确并且声声人耳,是典型的顺畅型说话方式这种类型的人要么不说话,要么

Linux下读取默认MAC地址

一、适用范围 这里主要介绍读取网卡MAC地址的方法,适用于EasyARM-i.MX287A开发套件,其应用原理及配套示例也适用于下表1.1所列出的产品型号。 二、原理介绍 MAC(Media Access Control,介质访问控制)是用来定义网络设备的位置。用来表示互联网上每一个站点的标识符,采用十六进制数表示,共六个字节(48位)。其中,前三个字节是由IEEE的注册管理机构RA负责给

win7上R读取excel过程

win7上R读取excel过程 按照书上操作,出现 Error in odbcConnectExcel("c:/r-workspace/contacts.xls") :    odbcConnectExcel is only usable with 32-bit Windows 测试使用剪贴板(先将数据复制,则存在剪贴板了)的读取excel的方法,是可