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

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

相关文章

解决Java中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

matlab读取NC文件(含group)

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