使用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. React package.json详解

    概述: 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件 ...

  2. Linux相关知识总结

    查看CPU使用情况 查看内存 ps命令显示所有运行中的进程等命令 top 命令用来显示CPU的使用情况free命令用来显示内存的使用情况 select和epoll区别select,poll,epoll ...

  3. pyqt简单介绍和使用

    QML和PyQT5联合编程 安装pyqt pip3 install PyQT5 main.QML import QtQuick 2.2 import QtQuick.Controls 1.1 impo ...

  4. TFS2015源代码管理器无法建立团队项目的问题

    最近在服务器安装了微软最新版的TFS2015  正版要钱,网络上还没有能找到可用的key,因此我只能使用试用版. 安装完成后,使用我本地的vs2013  vs2012  vs2010  vs2014 ...

  5. zw黑天鹅足彩实盘测试5月数据包

    [文件说明] $mx1,是单日数据:$mx9,是日数据和 入选率:2%, 准确度:40% 盈利率:120%左右 目前在测试稳定性 5月1日-6月14日,实盘数据 $mx9,15061409x15061 ...

  6. AVAudioFoundation(5):音视频导出

    本文转自:AVAudioFoundation(5):音视频导出 | www.samirchen.com 本文主要内容来自 AVFoundation Programming Guide. 要读写音视频数 ...

  7. 20145314郑凯杰《网络对抗技术》实验5 MSF基础应用

    20145314郑凯杰<网络对抗技术>实验5 MSF基础应用 1.0 MS08_067安全漏洞 1.1 实验目标 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单 ...

  8. git clone时,提示warning: remote HEAD refers to nonexistent ref, unable to checkout

    一.环境 发行版:Ubuntu 18.04.1 LTS 代号:bionic 内核版本:4.15.0-30-generic 二.背景 git clone https://source.codeauror ...

  9. Java8 Lambda

    Demo: package com.qhong; public class Main { public static void main(String[] args) throws Exception ...

  10. SpringMVC 原理和流程

    请求到来时,第一个接受这个请求的前端控制器叫DispatcherServlet(这个需要在web.xml中配置),后端控制器叫Controller. 简化版流程: 1.spring mvc将所有的请求 ...