Как мне указать сборщику адресной книги, какие поля заполнять? - PullRequest
0 голосов
/ 23 февраля 2012

Я ОЧЕНЬ новичок в разработке под iOS.Поэтому, пожалуйста, сделайте ваш ответ максимально точным и базовым.

У меня есть форма с двумя (на данный момент - может быть и больше) полями, рядом с которыми будет кнопка, позволяющая пользователю выбиратьконтакт из адресной книги iPad и заполните соответствующее поле с именем и фамилией из адресной книги.

Basic Form Mockup

Пример кода, который я имею получилменя до такой степени, что я могу заполнить имя контакта.Тем не менее, я хотел бы иметь возможность щелкнуть кнопку «Обзор контактов» рядом с «По ссылке», чтобы она использовала те же функции для заполнения по указанному имени.Я вижу, что функция 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 Ответ

3 голосов
/ 23 февраля 2012

Вот один из способов сделать это.

Во-первых, присвойте своей кнопке «Обзор контактов» уникальные значения int для их свойства tag при их создании (или в раскадровке, если вы используете раскадровки), чтобы вы могли различить их в своем getContactName: методе.Я бы предложил установить tag = 0 для первой кнопки и tag = 1 для второй кнопки.

Затем добавить новое свойство в ваш класс ViewController, который будет хранить указатель на целевое текстовое поле после нажатия кнопки.,(Обязательно @synthesize в вашем файле .m)

@property (nonatomic, strong) UITextField *targetTextField;

В getContactName: проверьте объект-отправитель и используйте его значение tag для правильной установки указателя.(Обратите внимание, что отправителем будет объект UIButton, по которому щелкнул пользователь).

- (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];
}

Затем в fillContactName: задайте текстовое значение для текстового поля в targetTextField, которое вы ранее установили.

- (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];
}

Обратите внимание, что я использовал * 109 * метод класса stringWithFormat:, чтобы сделать ваш код fillContactName более кратким.Это часто используемый метод в подобных случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...