清秋梧桐

导航

在iOS程序用调用程序通讯录,并获得相关信息

  • 要实现该功能, 必须要导入两个系统框架, 分别是

    #import <AddressBook/AddressBook.h>

    #import <AddressBookUI/AddressBookUI.h>

  • 之后,通过适当的事件来在程序中弹出通讯录,比如为UIButton添加一个点击事件来弹出通讯录

    - (IBAction)btnClick:(id)sender

    {

        ABPeoplePickerNavigationController *peoleVC = [[ABPeoplePickerNavigationControlleralloc] init];

        peoleVC.peoplePickerDelegate = self;

        [self presentModalViewController:peoleVC animated:YES];

        //特别注意,这里要使用膜态弹出。

        [peoleVC release];

    }

     

    这个时候, 已经可以顺利的弹出通讯录,但是当我们点击右上角的cancel按钮,已经点击联系人的电话的时候,程序不能正确响应我们的操作,我们还需要实现代理(@protocol ABPeoplePickerNavigationControllerDelegate <NSObject>)方法来完成功能。

     

  • 通过相应的代理方法取得通讯录中的数据。主要代理方法如下:
    • - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker

      {

          NSLog(@"peoplePickerNavigationControllerDidCancel");

          

          [selfdismissModalViewControllerAnimated:YES];

      }

       

      该方法在用户点击弹出通讯录右上角的cancel按钮的时候调用,我们可以在这个方法里实现我们退出通讯录的操作:[selfdismissModalViewControllerAnimated:YES];

       

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

      {

          return YES;

      }

       

      当用户通过一个时间进入对话框的时候,显示出来的是一个联系人界面,列出了所有联系人的名字。这个方法就是确定用户是否可以通过点击联系人,查看某个联系人的详情。如果返回 NO,则无法查看列表中联系人的详情,默认返回值为 YES。

       

    • - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier

      {

          //取联系人姓名

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

          NSLog(@"=======>%@",name);

          

          //判断点击的区域

          if (property == kABPersonPhoneProperty)

          {

              //取出当前点击的区域中所有的内容

              ABMutableMultiValueRef phoneMulti =  ABRecordCopyValue(person,kABPersonPhoneProperty);

              //根据点击的那一行对应的identifier取出所在的索引

              int index =  ABMultiValueGetIndexForIdentifier(phoneMulti, identifier);

              //根据索引把相应的值取出

              NSString *phone =  (NSString *)ABMultiValueCopyValueAtIndex(phoneMulti, index);

              

              NSLog(@"%@",phone);

          }

          

          [self dismissModalViewControllerAnimated:YES];

          

          return NO;

      }

       

      该代理方法响应用户进入联系人详情页面后的相关操作,比如去的联系人的某个电话号码。返回值用来表示是否响应系统默认的点击操作,例如,当返回值为yes的之后,我们点击用户的电话号码,除了进行我们规定的取值操作意外,还会执行系统默认的拨号操作,我们当然,如果点击网址,就会打开浏览器,进入点击的页面。 因此,我们将返回值设置为NO。


posted on 2012-11-13 14:30  清秋梧桐  阅读(717)  评论(0编辑  收藏  举报