iOS-----使用addressBook管理联系人之修改联系人
使用addressBook管理联系人之修改联系人
修改联系人
修改联系人先从底层地址簿中加载一条ABRecordRef记录,然后对这条ABRecordRef记录的属性值进行修改,修改完成后把这条修改后的ABRecordRef记录存入地址簿即可.
|
修改联系人的步骤大致如下 |
|
|
1 |
获取底层地址簿中已有的联系人对应的ABRecordRef记录 |
|
2 |
根据需要修改的属性,调用ABRecordSetValue()函数修改ABRecordRef记录中指定属性的值 |
|
3 |
修改完成后调用ABAddressBookSave()函数将刚刚所做的修改保存到底层地址簿 |
|
代 码 片 段 |
#import <AddressBook/AddressBook.h>
#import “LCUpdatePersonViewController.h”
#define PHONE_PROPERTY_KEY @”phone”
#define MAIL_PROPERTY_KEY @”mail”
@interface LCUpdatePersonViewController()
{
ABAddressBookRef ab;
// 定义ABRecordRef 类型的变量保存当前正在更新的记录
ABRecordRef rec;
// 使用该变量定义当前动态添加的行的Y坐标
NSInteger curLineY;
// 定义一个NSMUtableDictionary来保存所有动态添加的文本框
NSMUtableDictionary *textFields;
// 定义ABMutableMultiValueRef变量记录正在修改的电话号码属性值
ABMutableMultiValueRef phoneValue;
// 定义ABMutableMultiValueRef变量记录正在修改的电子邮件属性值
ABMutableMultiValueRef mailValue;
}
@end
@implementation LCUpdatePersonViewController
- (void)viewDidLoad
{
[super viewDidLoad];
textFields = [NSMutableDictionary dictionary];
curLineY = ;
CFErrorRef error = nil;
// 创建ABAddressBook, 该函数的第1个参数暂时并未使用,直接传入NULL即可
ab = ABAddressBookRequestAccessWithCompletion(ab,
^(bool granted, CFErrorRef error)
{
// 如果用户允许访问地址簿
if(granted)
{
// 获取ID为1的ABRecordRef记录
rec = ABAddressBookGetPersonWithRecordID(ab, );
// 获取rec记录中kABPersonFirstNameProperty(名字)属性的值
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(rec, kABPersonFirstNameProperty);
// 获取rec记录中kABPersonLastNameProperty(姓氏)属性值
NSString *lastName = (__bridge NSString*)ABRecordCopyValue(rec, kABPersonLastNameProperty );
// 控制界面上文本框显示rec记录中姓氏、名字的属性值
self.firstNameField.text = firstName;
self.lastNameField.text = lastName;
// 获取rec记录中kABPersonPhoneProperty(电话号码)属性值
phoneValue = ABRecordCopyValue(rec, kABPersonPhoneProperty);
// 调用addLabelAndTextField:propertyKey:方法显示电话号码
[self addLabelAndTextField:phoneValue propertyKey:PHONE_PROPERTY_KEY];
// 获取rec记录中kABPersonEmailProperty(电子邮件)属性值
mailValue = ABRecordCopyValue(rec, kABPersonEmailProperty);
// 调用addLabelAndTextField:propertyKey:方法显示电子邮件
[self addLabelAndTextField:mailValue propertyKey:MAIL_PROPERTY_KEY];
}
});
}
}
- (void) addLabelAndTextField:(ABMutableMultiValueRef) multiValue propertyKey:(NSString *)property
{
// 获取multiValue包含的数据条数
NSInteger num = ABMultiValueGetCount(multiValue);
NSMutableArray *textFieldArray = [NSMutableArray array];
// 依次遍历multiValue所包含的每条数据
for (int i = ; i < num; i++ )
{
curLineY += ;
// 创建UILabel,显示本条数据的label
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, curLineY, , )];
NSString *labelStr = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(multiValue, i));
label.text = labelStr;
// 将该UILabel添加到程序界面上
[self.view performSelectorOnMainThread:@selector(addSubview:)
withObject:label waitUntilDone:YES];
// 创建UITextField显示本条数据的value
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(, curLineY, , )];
textField.borderStyle = UITextBorderStyleRoundedRect;
NSString *valueStr = (__bridge NSString*)ABMultiValueCopyValueAtIndex(multiValue, i);
textField.text = valueStr;
[textField addTarget:self action:@selector(finishEdit:) forControlEvents:UIControlEventEditingDidEndOnExit];
// 使用NSArray集合来保存动态创建的UITextField控件
[textFieldArray addObject: textField];
// 将UITextField添加到程序界面上
[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:textField waitUntilDone:YES];
}
// 将程序动态生成的所有textField保存到NSMutableDictionary中
[textFields setValue:textFieldArray forKey:property];
}
- (void) updateMultiValue: (ABMutableMultiValueRef) multiValue propertyKey :( NSString* )propertyKey property:(ABPropertyID) property
{
// 取出该属性对应的所有UITextView组成的NSArray
NSArray *textFieldArray = textFields[propertyKey];
NSInteger num = textFieldArray.count;
// 创建一个新的ABMutableMultiValueRef
ABMutableMultiValueRef newMulti = ABMultiValueCreateMutable(property);
// 遍历UITextView组成的NSArray集合中的每个UITextField控件
for(int i = ; i< num; i++)
{
// 获取第i个UITextField控件中的字符串,该字符串作为新的值
NSString *value = ((UITextField*)textFieldArray[i]).text;
// 获取第i 条数据原有的label
CFStringRef label = ABMultiValueCopyLabelAtIndex(multiValue, );
// 添加新的值和原有的label(label不需要修改)
ABMultiValueAddValueAndLabel(newMutli, (__bridge
CFStringRef)value, label, NULL);
}
ABRecordSetValue(rec, property, newMutli, NULL);
}
- (IBAction)update:(id)sender
{
NSString *firstName = self.firstnameField.text;
NSString *lastName = self.lastnameField.text;
// 修改rec记录中的kABPersonFirstNameProperty、kABPersonLastNameProperty属性
ABRecordSetValue(rec, kABPersonFirstNameProperty, (__bridge CFStringRef)firstName, NULL);
ABRecordSetValue(rec, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL);
// 调用updateMultiValue:propertyKey:property:方法修改ABRecordRef的
// kABPersonPhoneProperty属性
[self updateMultiValue:phoneValue propertyKey:PHONE_PROPERTY_KEY property:kABPersonPhoneProperty];
// 调用updateMultiValue:propertyKey:property:方法修改ABRecordRef的
// kABPersonEmailProperty属性
[self updateMultiValue:mailValue propertyKey:MAIL_PROPERTY_KEY property:kABPersonEmailProperty];
if(ABAddressBookSave(ab, NULL))
{
[self showAlert:@”修改成功”];
}
else
{
[self showAlert:@”修改出现错误”];
}
}
- (IBAction)finishEdit:(id)sender
{
[sender resignFirstResponder];
}
- (void)showAlert:(NSString *)msg
{
// 使用UIAlertView显示msg信息
[[[UIAlertView alloc] initWithTitle:@” 提 示 ”
message:msg
delegate:nil
cancelButtonTitle:@”确定”
otherButtonTitles:nil] show];
}
@end
|
|
注意 |
为了让界面能动态显示ABMutableMultiValueRef包含的每一条数据,程序定义了addLabelAndTextField:propertyKey:方法来动态加载ABMutableMultiValueRef中的每一条数据----程序为每条数据添加一行,用UILabel显示这条数据的label,用UITextField显示这条数据的value |
效果图:

iOS-----使用addressBook管理联系人之修改联系人的更多相关文章
- C++通讯录管理系统(添加联系人,显示联系人,删除联系人,查找联系人,修改联系人,清空联系人,退出通讯录)
1 /** 2 * ProjectNmae:通讯录管理系统 3 * 功能: 4 * 添加联系人:向通讯录添加新人 5 * 显示联系人:显示通讯录中的所有联系人信息 6 * 删除联系人:按照姓名进行删除 ...
- ERP客户关系渠管理添加和修改联系人(二十一)
树形结构treeview 前端代码: <form id="form1" runat="server"> <div> <asp:Tr ...
- iOS-----使用AddressBook管理联系人
使用AddressBook管理联系人 iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name).名(first name).电话.E-mail地址.住址.生日等各种 ...
- 【Android Developers Training】 100. 使用Intent修改联系人数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 理解 iOS 的内存管理
远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...
- Android 把电话保存到现有联系人 已有联系人
搜索了很长时间,想找个把电话保存到现有联系人的代码,就是打开选中的联系人编辑界面,然后自动添加电话,再手动保存,就跟手机上的一样,功夫不负有心人,终于给搜到了,很不容易啊,现分享如下, // 保存至现 ...
- iOS之内存管理(ARC)
iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- [git 学习篇]git管理的是修改,并非文件
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. 为什么说Git管理的 ...
随机推荐
- (android实战)破解apk
简单的总结几个关键步骤: 一.工具准备:apktool , dex2jar , jd-gui 二.使用dex2jar + jd-gui 得到apk的java源码 1.用解压工具从 apk包中取出 cl ...
- [转]AJAX 跨源 HTTP 请求
转自OSChina, 原文: http://www.oschina.net/translate/ajax-cross-origin-http-request 背景 跨源HTTP请求(也称跨域AJAX请 ...
- CCPC-Wannafly Winter Camp Day4 (Div2, onsite)
Replay Dup4: 两轮怎么退火啊? 简单树形dp都不会了,送了那么多罚时 简单题都不想清楚就乱写了,喵喵喵? X: 欧拉怎么回路啊, 不会啊. 还是有没有手误?未思考清楚或者未检查就提交, 导 ...
- Flask权限管理
权限管理功能的实现可以分为以下几个小块: 1,新建数据库表Role,里面包括id(Integer,主键)name(String),permission(Integer),default(boolean ...
- jQuery Mobile中的页面加载与跳转机制
第一次做用jQuery Mobile做东西,发现一些跟平时的思维习惯不太一样的.其中这个框架的页面加载机制便是其中一个.如果不明白其中的奥秘,往往会出现一些让人摸不着头脑的怪现象,比如页面进入后点击按 ...
- POJ 2923 Relocation(状压DP+01背包)题解
题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在.我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ ...
- SprigBoot核心技术
启动原理 运行流程 自动配置原理 一.启动原理 SpringApplication.run(主程序类)– new SpringApplication(主程序类)• 判断是否web应用• 加载并保存所有 ...
- MyBatis的简单入门学习
一个新知识开始是最难学的.(万事开头难) MyBatis大体分三层,接口层,数据处理层,基础支撑层. 其中接口层不是java中的那个interface,而是框架和程序员之间的对接.一个API,程序员可 ...
- Win7SDK
1.ISO下载地址: http://www.microsoft.com/en-us/download/details.aspx?id=8442 2.可供下载的 版本有3个,网上搜到的解释: GRMSD ...
- JAVA技术分享:消失的线程
很多小伙伴都问过我一个问题,就是任务线程跑着跑着消失了,而且没有任何异常日志.我都是条件反射式的回复,是不是用了线程池的submit提交任务.而且很大几率对方给予肯定答复. 解决方案,很多人都听过不少 ...