Как обойти отсутствие кнопки «Добавить» в ABPeoplePickerNavigationController? - PullRequest
3 голосов
/ 25 июня 2009

Мое приложение должно связывать экземпляры пользовательского класса с записями контактов в адресной книге iPhone. Все хорошо, когда я представляю ABPeoplePickerNavigationController и позволяю пользователю выбрать существующий контакт. Проблема в том, что нет очевидного способа, позволяющего пользователю легко добавлять запись контакта, если та, которую он ищет, уже не существует в его адресной книге.

Как люди получают от ABPeoplePickerNavigationController до ABNewPersonViewController таким простым и интуитивно понятным для пользователя способом *

Ответы [ 3 ]

6 голосов
/ 15 октября 2011

Вы можете создать UIBarButton и добавить его в UINavigationBar ABPeoplePickerNavigationController следующим образом.

    peoplePicker.topViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson:)];

-(IBAction)addPerson:(id)sender{
    ABNewPersonViewController *view = [[ABNewPersonViewController alloc] init];
    view.newPersonViewDelegate = self;
    UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:view];
    [self.picker presentModalViewController:nc animated:YES];
}

Проблема, с которой я столкнулся, заключалась в том, что ABPeoplePickerNavigationController имеет кнопку отмены, помещенную в слот rightBarButtonItem, и мне пришлось обновить панель навигации на

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{

Я задокументировал весь процесс в своем блоге с сработавшим примером , который должен позволить вам создать приложение в стиле контактов, аналогичное приложению на iPhone. Надеюсь, это поможет.

3 голосов
/ 12 мая 2013

Я нашел подход Скотта Шервуда вместе с демо, которое он разместил на своем сайте, очень полезным. Тем не менее, как упомянул один из комментаторов в своем блоге, существует проблема с кнопкой «Отмена» в режиме редактирования.

Я только что предложил исправление для демонстрации Скотта вместе с другим подходом для Person View Controller по адресу: http://finalize.com/2013/05/12/using-and-customizing-the-address-book-ui/

Мое предложение для Person View Controller состояло в том, чтобы вручную установить его в методе протокола

// Displays the information of a selected person
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{

    ABPersonViewController *view = [[ABPersonViewController alloc] init];

    view.personViewDelegate = self;
    view.displayedPerson = person; // Assume person is already defined.
    view.allowsEditing = YES;
    view.allowsActions = YES;

    [peoplePicker pushViewController:view animated:YES];

    return NO;
}

Единственная проблема здесь заключается в том, что табличное представление имен People Picker не обновляется автоматически после редактирования. Это можно исправить с помощью обратного вызова адресной книги. Я показываю, как это можно сделать в проекте GitHub, который я разместил по адресу:

https://github.com/scottcarter/AddressBookPeoplePicker.git

1 голос
/ 25 июня 2009

кажется, что невозможно добавить новый контакт непосредственно из ABPeoplePickerNavigationController. Поэтому, когда пользователь нажимает кнопку добавления, я представляю UIActionSheet с двумя кнопками:

- (void) addContact{

    contactMenu = [[UIActionSheet alloc] 
                           initWithTitle: nil 
                           delegate:self
                           cancelButtonTitle:@"Cancel"
                           destructiveButtonTitle: nil
                           otherButtonTitles:@"Select a contact", @"Add a new contact", NULL];

    [contactMenu showInView:self.view];

}

Вот соответствующий метод делегата:

    - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{



        if(buttonIndex == 0){
            // select an existing contact   
            ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
            peoplePicker.peoplePickerDelegate = self;
            [self presentModalViewController:peoplePicker animated:YES];

        }

        if(buttonIndex == 1){

            // add a new contact
            ABNewPersonViewController *newPersonViewController = [[ABNewPersonViewController alloc] init];
            newPersonViewController.newPersonViewDelegate = self;

            UINavigationController *personNavController = [[UINavigationController alloc] initWithRootViewController:newPersonViewController];
            [self presentModalViewController:personNavController animated:YES];

            [personNavController release];
            [newPersonViewController release];

        }

            if(buttonIndex == 2){
        // cancel the operation
        [actionSheet dismissWithClickedButtonIndex:2 animated:YES];
    }


}
...