使用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管理联系人之修改联系人的更多相关文章

  1. C++通讯录管理系统(添加联系人,显示联系人,删除联系人,查找联系人,修改联系人,清空联系人,退出通讯录)

    1 /** 2 * ProjectNmae:通讯录管理系统 3 * 功能: 4 * 添加联系人:向通讯录添加新人 5 * 显示联系人:显示通讯录中的所有联系人信息 6 * 删除联系人:按照姓名进行删除 ...

  2. ERP客户关系渠管理添加和修改联系人(二十一)

    树形结构treeview 前端代码: <form id="form1" runat="server"> <div> <asp:Tr ...

  3. iOS-----使用AddressBook管理联系人

    使用AddressBook管理联系人 iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name).名(first name).电话.E-mail地址.住址.生日等各种 ...

  4. 【Android Developers Training】 100. 使用Intent修改联系人数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 理解 iOS 的内存管理

    远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...

  6. Android 把电话保存到现有联系人 已有联系人

    搜索了很长时间,想找个把电话保存到现有联系人的代码,就是打开选中的联系人编辑界面,然后自动添加电话,再手动保存,就跟手机上的一样,功夫不负有心人,终于给搜到了,很不容易啊,现分享如下, // 保存至现 ...

  7. iOS之内存管理(ARC)

    iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...

  8. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  9. [git 学习篇]git管理的是修改,并非文件

    你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. 为什么说Git管理的 ...

随机推荐

  1. Spark Shuffle(三)Executor是如何fetch shuffle的数据文件(转载)

    1. 前言 在前面的博客中讨论了Executor, Driver之间如何汇报Executor生成的Shuffle的数据文件,以及Executor获取到Shuffle的数据文件的分布,那么Executo ...

  2. vue开发笔记

    1.一定要弄明白什么是数据驱动,以前jQuery操作dom的那种思维模式可以不去考虑,在类似框架中任何一个效果的完成都是由数据驱动来完成的. 2.以.vue作为扩展名的文件,是vue组件,他是一个类, ...

  3. Entity Framework在WCF中序列化的问题(转)

    问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...

  4. OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)

    http://blog.csdn.net/dcrmg/article/details/53677739 1. 基于直方图均衡化的图像增强   直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶 ...

  5. 解决use -D_SCL_SECURE_NO_WARNINGS的问题

    加入预处理器(项目属性----C/C++----预处理----预处理器定义): _SCL_SECURE_NO_WARNINGS

  6. Python学习札记(三十五) 面向对象编程 Object Oriented Program 6

    参考:实例属性和类属性 NOTE Python是动态语言,根据类创建的实例可以任意绑定属性. class Student(object): def __init__(self, name): self ...

  7. SpringBoot与Dubbo整合下篇

    (1)pom.xml引入相关依赖jar包,如下: <dependency> <groupId>com.alibaba</groupId> <artifactI ...

  8. POJ 3468 A Simple Problem with Integers(线段树:区间更新)

    http://poj.org/problem?id=3468 题意: 给出一串数,每次在一个区间内增加c,查询[a,b]时输出a.b之间的总和. 思路: 总结一下懒惰标记的用法吧. 比如要对一个区间范 ...

  9. haskell简明入门(一)

    本文的主要内容参考自<Haskell趣学指南> 1. What is Haskell?     以下内容引用自Haskell官网: Haskell是一个先进的,纯粹的函数式编程语言.一个典 ...

  10. 在 if 条件句中使用向量

    上述例子的函数中,都只输入了单一值.如果我们提供一个向量,那么这个函数将产生警告,这是因为 if 语句不能与多值向量共存.check_ _positive(c(1,-1,0))## Warning i ...