Отобразить 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];
}