如何告知地址簿选择器填写哪些字段?

时间:2012-02-23 17:01:37

标签: ios xcode xcode4 ios5

我对iOS开发非常新。因此,请尽可能准确和基本地回复您的回复。

我有一个表单,其中包含两个(目前可能还有更多)字段,每个字段旁边都有一个按钮,允许用户从iPad地址簿中选择一个联系人,并用第一个和第一个填写相关字段。地址簿中的姓氏。

Basic Form Mockup

The example code I have让我知道我可以填写联系人姓名。但是,我希望能够单击Referred By旁边的“浏览联系人”按钮,并让它使用相同的功能来填写引用的名称。我看到getContactName函数有sender参数。所以,我可以很容易地分辨出这两个按钮(或其他按钮)中的哪一个被点击了。

但是,当我从地址簿中选择时,我怎么知道在peoplePickerNavigationController或fillContactName函数中点击了哪个按钮?

- (IBAction)getContactName:(id)sender {

    ABPeoplePickerNavigationController *picker =
    [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;

    [self presentModalViewController:picker animated:YES];
}


- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {
        [self dismissModalViewControllerAnimated:YES];
}

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

    [self fillContactName:person];

    [self dismissModalViewControllerAnimated:YES];

    return NO;
}

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


- (void)fillContactName:(ABRecordRef)person
{
    NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,
                                                                    kABPersonFirstNameProperty);

    NSString *test = [firstName stringByAppendingString:@" "];

    NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person,
                                                                         kABPersonLastNameProperty);

    NSString *fullName = [test stringByAppendingString:lastName];

    self.contactName.text = fullName;

}

1 个答案:

答案 0 :(得分:3)

这是你可以做到的一种方式。

首先,在创建tag属性时,为其getContactName:属性分配“浏览联系人”按钮唯一的int值(如果您使用的是故事板,则在故事板中),以便您可以在{{@property (nonatomic, strong) UITextField *targetTextField; 中区分它们。 1}}方法。我建议为第一个按钮设置tag = 0,为第二个按钮设置tag = 1.

然后向ViewController类添加一个新属性,该属性将在单击按钮后存储指向目标文本字段的指针。 (务必在.m文件中使用@synthesize)

getContactName:

tag中,检查sender对象并使用其- (IBAction)getContactName:(id)sender { ... switch(sender.tag) { case 0: self.targetTextField = self.contactName; break; case 1: self.targetTextField = self.referredBy; break; default: self.targetTextField = nil; } [self presentModalViewController:picker animated:YES]; } 值来适当地设置指针。 (请注意,发件人将是用户单击的UIButton对象。)

fillContactName:

然后在- (void)fillContactName:(ABRecordRef)person { NSString* firstName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonFirstNameProperty); NSString* lastName = (__bridge_transfer NSString*)ABRecordCopyValue(person,kABPersonLastNameProperty); self.targetTextField.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; } 中,将文本值设置为您之前设置的targetTextField的文本字段。

NSString

请注意,我使用了stringWithFormat:类方法{{1}}来使fillContactName代码更简洁。在这种情况下,这是一种常用的方法。