【问题标题】:Address Book retrieve chosen phone number?通讯录检索选择的电话号码?
【发布时间】:2013-11-12 21:34:11
【问题描述】:

我的 Objective C 学习进展顺利,但在我的应用程序中遇到了障碍。

下面是我到目前为止的代码,只是一个简单的一键式应用程序,计划是单击该按钮将打开联系人,让您选择一个联系人,然后从可用的联系人中选择一个特定号码,该号码另存为最终是一个字段的文本。我已经做到了这一点,但我点击了联系人列表中的号码,但没有任何反应。

.h 文件:

#import <UIKit/UIKit.h>
#import <AddressBookUI/AddressBookUI.h>
#import <AddressBook/AddressBook.h>

@interface ViewController : UIViewController <UINavigationControllerDelegate,   ABPeoplePickerNavigationControllerDelegate>
@property (strong, nonatomic) IBOutlet UILabel *myLabel;
- (IBAction)myButton:(UIButton *)sender;

@end

.m 文件:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
 [super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)myButton:(UIButton *)sender {
ABPeoplePickerNavigationController *peoplePicker =
[[ABPeoplePickerNavigationController alloc] init];
peoplePicker.peoplePickerDelegate = self;
[self presentViewController:peoplePicker animated:YES completion:nil];
}

- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)picker
   shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
return YES;
}

- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)picker
  shouldContinueAfterSelectingPerson:(ABRecordRef)person
                            property:(ABPropertyID)property
                          identifier:(ABMultiValueIdentifier)identifier
{
return NO;
}

- (void)peoplePickerNavigationControllerDidCancel:
(ABPeoplePickerNavigationController *)picker
{
[self dismissViewControllerAnimated:YES completion:nil];
}

- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)pickershouldContinueAfterSelectingPerson :
(ABRecordRef)person  {

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

ABMutableMultiValueRef phones =
ABRecordCopyValue(person, kABPersonPhoneProperty);
NSArray *numbers =
(__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(phones);

ABMutableMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
NSString *addresses =
(__bridge_transfer NSString *)ABMultiValueCopyArrayOfAllValues(emails);

NSString *note =
(__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonNoteProperty);

NSLog( @"name = %@, numbers = %@, email = %@, note = %@",
      name, numbers, addresses, note );

//    WANT TO MAKE FOR EXAMPLE ( myTextField.text = CHOSEN NUMBER OF CONTACT

[self dismissViewControllerAnimated:YES completion:nil];
return YES;
}
@end

【问题讨论】:

  • 选择联系人后,您将如何/在哪里展示您的ABPersonViewController
  • @Marco 代码当前所说的例如 NSString *note = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonNoteProperty);相反,我将使用 NSString *chosenNumer = NUM​​BER CHOSEN BY USER FROM CONTACT
  • 希望这有意义吗?这就是我迷路的地方:S 最后希望的结果是用户可以选择一个联系人,然后选择其中一个联系人号码,然后将其放入文本字​​段中。谢谢!

标签: ios abaddressbook peoplepicker abpersonviewcontroller


【解决方案1】:

首先,在 .h 文件中声明您符合 ABPersonViewControllerDelegate

其次,在你的类中实现如下ABPersonViewControllerDelegate回调方法来枚举所选联系人的电话号码:

#pragma mark - ABPersonViewControllerDelegate protocol conformance

- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
{
    BOOL shouldPerformDefaultAction = YES;

    // Perform special action if phone number was selected
    if (property == kABPersonPhoneProperty)
    {
        CFTypeRef phoneProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);
        NSArray *phones = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneProperty);
        CFRelease(phoneProperty);

        for (NSString *phone in phones)
        {
            NSLog(@"phone = %@", phone);
        }

        shouldPerformDefaultAction = NO;

        [self.navigationController popViewControllerAnimated:YES];
    }

    // Otherwise, allow the default action to occur.
    return shouldPerformDefaultAction;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 2010-12-30
    • 2013-11-14
    • 2012-10-27
    • 2021-11-30
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多