2012-01-21 11 views
7

Mam nowy projekt, w którym chcę wyświetlić selektor osób po dotknięciu przycisku.Wyświetl ABPeoplePickerNavigationController przy użyciu serii scencase

Więc mam UIButton, który łączy się z generycznym UIViewController z identyfikatorem showContacts. Ustawiłem klasę ViewController na ABPeoplePickerNavigationController.

Teraz moim głównym ViewController Mam ten kod, aby zainicjować moje próbnika:

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

Chociaż Dodałem kontakty testowe do mojego Simulator książki adresowej wyników wygląda tak:

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

Poniższy kod, który jest bardzo podobny do tego, co robię w metodzie prepareForSegue:, udaje mi się pokazać selektor za pomocą 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]; 
} 

Rezultat:

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

To nie jest dla mnie jasne, dlaczego ludzie zbieracz nie pokazuje.

Odpowiedz

3

Co ciekawe, to co zasugerowałem na Can I use segues with designated initializers of view controllers? rozwiązało problem również dla mnie. Więc stworzenie ViewController proxy dla ABPeoplePickerNavigationController rozwiązuje problem, ale to nie wyjaśnia, dlaczego wbudowanej zbieracze nie może być stosowany w storyboardy:

Jest to kod dla mojej klasy otoki:

#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

Odpowiedź Besi jest świetna. Ale to mniej kodu, aby użyć starego sposobu, zamiast używać storyboardu:

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

Jak zauważył Matt, stary dobry sposób jest w porządku. Jeśli chcesz korzystać z storyboardu, możesz dodać ABPeoplePickerNavigationController w swoim dostosowanym kontrolerze podglądu w ten sposób:

- (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];  
} 
Powiązane problemy