Отобразить ABPeoplePickerNavigationController, используя раскадровку

У меня есть новый проект, в котором я хочу отобразить "Выбор людей" при нажатии кнопки.

Итак, у меня есть UIButton который переходит к универсальному UIViewController с идентификатором showContacts, Я установил класс этого ViewController на ABPeoplePickerNavigationController,

Теперь в моем корневом ViewController у меня есть этот код для инициализации моего выбора:

#pragma mark - Segues

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([segue.identifier isEqualToString:@"showContacts"]){
        ABPeoplePickerNavigationController *ppnc = segue.destinationViewController;
        ppnc.peoplePickerDelegate = self;
        ppnc.addressBook = ABAddressBookCreate(); 
        ppnc.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]];
    }
}

Хотя я добавил тестовые контакты в свою адресную книгу симулятора, результаты выглядят так:

http://i.minus.com/jbwUQyLr36ChHo.png

С помощью следующего кода, который очень похож на то, что я делаю в prepareForSegue: метод, мне удается показать сборщик через IBAction:

- (IBAction)showPicker:(id)sender {

    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty], 
                               [NSNumber numberWithInt:kABPersonEmailProperty],
                               [NSNumber numberWithInt:kABPersonBirthdayProperty], nil];
    picker.displayedProperties = displayedItems;
    // Show the picker 
    [self presentModalViewController:picker animated:YES];
}

Результат:

http://i.minus.com/jeEVeIBmfIYdR.png

Мне не понятно, почему сборщик людей не показывает.

3 ответа

Решение

Любопытно, что я предложил на Можно ли использовать segues с назначенными инициализаторами контроллеров представления? исправил проблему и для меня. Таким образом, создание прокси ViewController для ABPeoplePickerNavigationController устраняет проблему, но не объясняет, почему встроенные средства выбора нельзя использовать в раскадровках:

Это код для моего класса оболочки:

#import "PeoplePickerViewControllerWrapper.h"

@implementation PeoplePickerViewControllerWrapper

@synthesize ppvc = _ppvc;  // This is the object I'm proxying (The proxyee so to speak)
@synthesize delegate = _delegate;

- (void)awakeFromNib
{
        self.ppvc = [[ABPeoplePickerNavigationController alloc] init ];
        self.ppvc.peoplePickerDelegate = self;
        self.ppvc.addressBook = ABAddressBookCreate(); 
        self.ppvc.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]];
}

#pragma mark - View lifecycle

- (void)loadView
{
    [super loadView];
    [self.ppvc loadView];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.ppvc viewDidLoad];
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.ppvc viewWillAppear:animated];
}

-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    [self.ppvc viewDidDisappear:animated];
}

-(UIView *)view{
    return self.ppvc.view;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    [self.ppvc viewDidUnload];
}

Ответ Беси великолепен. Но это меньше кода, чтобы просто использовать старый способ вместо раскадровки:

- (void)showPeoplePicker:(id)sender
{
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    picker.modalPresentationStyle = UIModalPresentationFullScreen;
    picker.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:picker
                       animated:YES                     
                     completion:^{
                     // animation to show view controller has completed.
                     }];
}

Как заметил Мэтт, старый добрый путь в порядке. Если вы хотите использовать раскадровку, вы можете добавить ABPeoplePickerNavigationController в свой настраиваемый контроллер представления следующим образом:

- (void)awakeFromNib
{    
    ABPeoplePickerNavigationController * peoplePicker = [[ABPeoplePickerNavigationController alloc] init];
    peoplePicker.peoplePickerDelegate = self;
    // Display only a person's phone and address
    NSArray * displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonAddressProperty],
                            [NSNumber numberWithInt:kABPersonPhoneProperty],
                            nil];

    peoplePicker.displayedProperties = displayedItems;

    [self.view addSubview:peoplePicker.view];
    [self addChildViewController:peoplePicker];
    [peoplePicker didMoveToParentViewController:self];    
}
Другие вопросы по тегам