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管理的 ...
随机推荐
- Docker学习笔记(一):在本地安装和配置Docker
由于公司里测试服务器时常会有变动,每次变动之后都需要在新的服务器上配置一遍环境,实在是麻烦.后来我突然想到了在网上看到的资料中说Docker能快速部署可移植的容器,所以我就试着用Docker搭建了 ...
- Django 模型(数据库)
Django 模型(数据库) ) email = models.EmailField() memo = models.TextField() def __unico ...
- CSS样式有哪些常用的属性?
一般的一个DIV的CSS设置属性有:margin,padding,width,height,font-size,text-align,background,float,border CSS样式有哪些常 ...
- centos7 lua安装
yum -y install gcc automake autoconf libtool makeyum install readline-develcurl -R -O http://www.lua ...
- rails性能优化
1,使用Unicorn或者Thin服务器替代默认的webrick.2,静态资源压缩合并,放到云存储上.3,同时可以使用rails的Turbolinks,使用js替换title和body,但也带来了js ...
- Linux常用命令实践
一.开机自动挂载文件系统设置 在/media下新建RHEL目录,并把/dev/sr1第二块光驱挂载到该目录 #mkdir /media/RHEL #mount /dev/sr1 /media/RHEL ...
- Codeforces Round #530 (Div. 2) Solution
A. Snowball 签. #include <bits/stdc++.h> using namespace std; ], d[]; int main() { while (scanf ...
- “System.Runtime.InteropServices.COMException (0x80070422): 无法启动服务”解决方法
应用程序中发生了无法处理的异常.如果单击“退出”,应用程序将立即关闭.无法启动服务,原因可能是已被禁用或其相关联设备没有启动.(异常来自HRESULT:0X80070422).点击详细内容:有关调用实 ...
- bzoj1615 / P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler
P2903 [USACO08MAR]麻烦的干草打包机The Loathesome Hay Baler 细节题.$O(n^{2})$的$bfs$可过. #include<iostream> ...
- 20145326 《Java程序设计》实验五——Java网络编程及安全实验报告
实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和20145211黄志远http://www.cnblogs.com/nostalgia-/组 ...