7

ボタンがタッチされたときに People Picker を表示したい新しいプロジェクトがあります。

だから私は識別子UIButtonを持つジェネリックにセグエを持っています。この ViewController のクラスを に設定します。UIViewControllershowContactsABPeoplePickerNavigationController

ルート 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

People ピッカーが表示されない理由はよくわかりません。

4

3 に答える 3

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.
                     }];
}
于 2012-04-21T10:30:20.813 に答える
3

不思議なことに、View Controller の指定された初期化子でセグエを使用できますか? で提案したことは? 私の問題も修正しました。したがって、問題を修正するためのプロキシ 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];
}
于 2012-01-21T21:23:21.470 に答える
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];    
}
于 2012-12-07T19:04:09.353 に答える