2012-01-21 1 views
7

У меня есть новый проект, в котором я хочу отобразить People Picker, когда нажата кнопка.Дисплей ABPeoplePickerNavigationController с помощью раскадровки segue

Таким образом, у меня есть 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]]; 
    } 
} 

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

no picker 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]; 
} 

Результат:

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

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

ответ

3

Любопытно, что я предложил на Can I use segues with designated initializers of view controllers? исправил проблему и для меня. Так создание прокси 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]; 
} 
5

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

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

Как отметил Мэтт, старый добрый путь в порядке. Если вы хотите использовать раскадровку, вы можете добавить 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];  
}