7

我有一个新项目,我想在触摸按钮时显示人员选择器。

所以我有一个带有标识符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

我不清楚为什么人员选择器不显示。

4

3 回答 3

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

奇怪的是,我在Can I use segues with specified initializers of view controllers 上的建议是什么?也为我解决了这个问题。因此,为解决问题创建代理 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 回答