iPhone入门学习——AddressBook学习笔记


AddressBook学习笔记


一.基本知识


和通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示iPhone数据库中的联系人信息。


二.具体介绍


1.AddressBookUI显示部分


AddressBookUI中提供了和联系人显示信息相关的一些Controller,有四个:


ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息


ABPersonViewController:显示一个具体联系人的信息


ABNewPersonViewController:增加一个新的联系人


ABUnknownPersonViewController:完善一个联系人的信息



由于其中最主要的是ABPeoplePickerNavigationController,因此就具体的介绍一下通过程序显示整个通讯录并且可以选择其中某个联系人信息的步骤。


(a)创建并初始化一个ABPeoplePickerNavigationController对象


(b)设置其代理(delegate)


(c)用presentModalViewController:animated:这个方法进行显示整个通讯录页面


例子:


- (IBAction)showPicker:(id)sender {


    ABPeoplePickerNavigationController *picker =


            [[ABPeoplePickerNavigationController alloc] init];


    picker.peoplePickerDelegate = self;




    [self presentModalViewController:picker animated:YES];


    [picker release];


}



ABPeoplePickerNavigationControllerDelegate的方法介绍


(a)peoplePickerNavigationControllerDidCancel:当用户选择取消时调用这个方法,可以在这个方法里取消整个通讯录页面的显示。


(b)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:当用户选择了通讯录中某一个联系人时调用这个方法,可以在这里获取联系人的信息。如果希望可以继续显示这个联系人更具体的信息,则return YES。否则取消整个通讯录页面的显示并return NO。


(c)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:如果上一个方法返回的是YES,则会显示某一个联系人信息,如果选择了联系人的某一项纪录,就会调用这个方法,可以通过点击选择联系人的某一项信息。如果希望可以对选择的某一项纪录进行进一步操作,比如直接拨打电话或调用邮箱发送邮件,则return YES。否则取消整个通讯录页面的显示并return NO。


例子:


- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {



// assigning control back to the main controller



[picker dismissModalViewControllerAnimated:YES];


}



- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {



//获取联系人姓名



name.text = (NSString*)ABRecordCopyCompositeName(person);



//获取联系人电话



ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);



NSMutableArray *phones = [[NSMutableArray alloc] init];



int i;



for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {




NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];




NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];




NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);




if([aLabel isEqualToString:@"_$!<Mobile>!$_"])




{





[phones addObject:aPhone];




}



}



phoneNo.text=@"";



if([phones count]>0)



{




NSString *mobileNo = [phones objectAtIndex:0];




phoneNo.text = mobileNo;




//NSLog(mobileNo);



}



//获取联系人邮箱



ABMutableMultiValueRef emailMulti = ABRecordCopyValue(person, kABPersonEmailProperty);



NSMutableArray *emails = [[NSMutableArray alloc] init];



for (i = 0;i < ABMultiValueGetCount(emailMulti); i++)



{




NSString *emailAdress = [(NSString*)ABMultiValueCopyValueAtIndex(emailMulti, i) autorelease];




[emails addObject:emailAdress];



}



email.text=@"";



if([emails count]>0)



{




NSString *emailFirst=[emails objectAtIndex:0];




email.text = emailFirst;




//NSLog(emailFirst);



}





[peoplePicker dismissModalViewControllerAnimated:YES];





return NO;


}



- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker



  shouldContinueAfterSelectingPerson:(ABRecordRef)person










property:(ABPropertyID)property









  identifier:(ABMultiValueIdentifier)identifier{





return NO;




}




2.AddressBook部分


AddressBook框架部分主要是记录联系人的各个信息,ABRecordRef类型的记录既可以代表单个人(kABPersonType),也可以是一个集合(kABGroupType)。


通讯录中联系人的各个属性有两种形式,单值属性和多值属性。单值属性对应的只有一个值,比如联系人的姓名;多值属性对应的可能有多个值,比如联系人有多个电话号码等。


(a)常用方法


CFTypeRef ABRecordCopyValue (


   ABRecordRef record,


   ABPropertyID property


);


从一个记录中获取某个属性对应的值


(b)单值属性对应的方法


CFStringRef ABRecordCopyCompositeName (


   ABRecordRef record


);


获取联系人完整的姓名。


(c)多值属性对应的方法


CFTypeRef ABMultiValueCopyValueAtIndex (


   ABMultiValueRef multiValue,


   CFIndex index


);


返回对应位置处的属性值


CFStringRef ABMultiValueCopyLabelAtIndex (


   ABMultiValueRef multiValue,


   CFIndex index


);


返回对应位置处的属性标识


CFArrayRef ABMultiValueCopyArrayOfAllValues (


   ABMultiValueRef multiValue


);


返回包含所有属性值的数组


CFIndex ABMultiValueGetCount (


   ABMultiValueRef multiValue


);


返回属性值的个数


例子:



//获取联系人姓名



name.text = (NSString*)ABRecordCopyCompositeName(person);



//获取联系人电话



ABMutableMultiValueRef phoneMulti = ABRecordCopyValue(person, kABPersonPhoneProperty);



NSMutableArray *phones = [[NSMutableArray alloc] init];



int i;



for (i = 0; i < ABMultiValueGetCount(phoneMulti); i++) {




NSString *aPhone = [(NSString*)ABMultiValueCopyValueAtIndex(phoneMulti, i) autorelease];




NSString *aLabel = [(NSString*)ABMultiValueCopyLabelAtIndex(phoneMulti, i) autorelease];




NSLog(@"PhoneLabel:%@ Phone#:%@",aLabel,aPhone);




if([aLabel isEqualToString:@"_$!<Mobile>!$_"])




{





[phones addObject:aPhone];




}



}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值