2012-01-21 80 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

下面的代碼與我在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?上提出的建議也解決了我的問題。所以,開創了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

貝西的回答非常好。但它較少的代碼,只需使用的,而不是用故事板爲舊的方式:

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