2012-01-21 9 views
7

ボタンを押したときにピープルピッカーを表示する新しいプロジェクトがあります。ストーリーボードを使用してABPeoplePickerNavigationControllerを表示するsegue

したがってUIButtonは、UIViewControllerという識別子とshowContactsという一般名義になります。このViewControllerのクラスをABPeoplePickerNavigationControllerに設定しました。

#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

は今私のルートのViewControllerに私は私のピッカーを初期化するために、このコードを持っています

次のコードは、メソッドでの操作とよく似ていますが、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?に提案したことは、私にとっても問題を解決しました。だから、内蔵のピッカーはストーリーボードで使用することができない理由は、ABPeoplePickerNavigationController修正問題のプロキシのViewControllerを作成するが、それは説明していない:

これは私のラッパークラスのコードです:

#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

Besiの答えは素晴らしいです。しかし、ストーリーボードを使用する代わりに古い方法を使用するコードは少なくなっています。

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

Mattは良い古い方法は問題ありません。ストーリーボードを使用する場合は、カスタマイズしたビューコントローラーでABPeoplePickerNavigationControllerを次のように追加できます。

関連する問題