2012-01-21 15 views
7

Ho un nuovo progetto in cui voglio visualizzare un People Picker, quando viene toccato un pulsante.Mostra ABPeoplePickerNavigationController utilizzando storyboard seguito

Quindi ho un UIButton che passa a un UIViewController generico con l'identificatore showContacts. Ho impostato la classe di questo ViewController su ABPeoplePickerNavigationController.

Ora nel mio ViewController radice ho questo codice per inizializzare il mio picker:

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

Anche se ho aggiunto contatti di test al mio Simulator Rubrica i risultati si presenta così:

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

Con il seguente codice, che è molto simile a quello che faccio nel metodo prepareForSegue:, riesco a mostrare un selettore tramite un 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]; 
} 

Il risultato:

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

Non è chiaro perché il selettore gente non mostra.

risposta

3

Stranamente, ciò che ho suggerito su Can I use segues with designated initializers of view controllers? ha risolto il problema anche per me. Quindi la creazione di un ViewController proxy per i ABPeoplePickerNavigationController risolve il problema, ma non spiega, perché i raccoglitori incorporate non possono essere utilizzati in storyboard:

Questo è il codice per la mia classe wrapper:

#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

La risposta di Besi è ottima. Ma è meno codice per utilizzare solo il vecchio modo invece di utilizzare uno storyboard per esso:

- (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

Come osservato Matt il buon vecchio modo è ok. Se si desidera utilizzare lo storyboard, è possibile aggiungere ABPeoplePickerNavigationController nel proprio controller di visualizzazione personalizzato in questo modo:

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