2012-01-21 28 views
7

Tôi có một dự án mới nơi tôi muốn hiển thị Công cụ chọn người, khi một nút được chạm vào.Hiển thị ABPeoplePickerNavigationController bằng cách sử dụng phân đoạn bảng phân cảnh

Vì vậy, tôi có một số UIButton phân cách thành số chung UIViewController với số nhận dạng showContacts. Tôi đặt lớp của ViewController này thành ABPeoplePickerNavigationController.

Bây giờ trong ViewController gốc của tôi, tôi có mã này để khởi tạo bảng chọn của tôi:

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

Mặc dù tôi đã thêm vào danh bạ thử nghiệm để Sổ địa chỉ Simulator của tôi kết quả sẽ như thế này:

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

Với mã sau, rất giống với mã tôi làm theo phương pháp prepareForSegue:, tôi quản lý để hiển thị công cụ chọn qua một số 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]; 
} 

Kết quả:

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

Nó không phải là rõ ràng với tôi lý do tại sao chọn dân không hiển thị.

Trả lời

3

Điều tò mò tôi đề xuất trên Can I use segues with designated initializers of view controllers? cũng khắc phục sự cố cho tôi. Vì vậy, việc tạo ra một ViewController proxy cho các ABPeoplePickerNavigationController sửa chữa vấn đề này, nhưng nó không giải thích, tại sao hái built-in không thể được sử dụng trong cốt truyện:

Đây là mã cho lớp wrapper của tôi:

#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

Câu trả lời của Besi thật tuyệt vời. Nhưng ít mã hơn chỉ sử dụng cách cũ thay vì sử dụng bảng phân cảnh cho nó:

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

Như Matt lưu ý cách cũ tốt là ok. Nếu bạn muốn sử dụng bảng phân cảnh, bạn có thể thêm ABPeoplePickerNavigationController vào bộ điều khiển chế độ xem tùy chỉnh của bạn như sau:

- (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];  
} 
Các vấn đề liên quan