2014-09-24 18 views
6

Tôi có một lớp con của ABPeoplePickerNavigationController để xử lý việc chọn số điện thoại liên hệ trong ứng dụng của mình. Mọi thứ hoạt động tốt trên iOS 7 trở xuống.Không thể chọn liên hệ trên iOS 8

Trên iOS 8, tuy nhiên, số ABPeoplePickerNavigationControllerDelegate của tôi không bị trúng khi chọn số điện thoại. Thay vào đó, nó chỉ gọi số điện thoại đó.

Tôi nhận thấy rằng phương pháp tôi đang sử dụng để xử lý lựa chọn liên hệ trong iOS 7 (peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:) không được chấp nhận trong iOS 8. Phương pháp này đã được thay thế bằng peoplePickerNavigationController:didSelectPerson:property:identifier:.

Tôi biết đại biểu của mình được đặt vì tôi đã nhận được cuộc gọi lại phương thức peoplePickerNavigationControllerDidCancel: thành công.

Có ai khác đã gặp sự cố này không?

Dưới đây là một đoạn mã của ABPeoplePickerNavigationController lớp con của tôi:

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { 

    [self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier]; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { 

    ...do stuff... 

    return NO; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 

    return YES; 
} 

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker { 

    [self dismissViewControllerAnimated:self.shouldAnimateDismiss completion:NULL]; 
} 
+0

Bạn đã chỉ định 'predicateForSelectionOfProperty' là gì? – Rob

+0

Bạn đang xây dựng với Xcode 6 và dự án của bạn có SDK cơ sở của iOS 8 không? – rmaddy

+0

@Rob Không có gì. Nó đã luôn luôn làm việc mà không cần thiết lập đó. – Alexander

Trả lời

6

đâu bạn xác định peoplePickerDelegate?

Trong iOS 8, nếu bạn chỉ định peoplePickerDelegate trong viewDidLoad, bạn sẽ gặp phải hành vi tò mò mà bạn mô tả (hủy tác phẩm đại biểu, didSelect...shouldContinue... không). Nếu bạn chỉ định peoplePickerDelegate ngay sau init (hoặc trong thời gian), nó hoạt động tốt.

Đây có vẻ là tính năng iOS 8 "". Tôi sẽ gửi báo cáo lỗi.

+0

Đó là vấn đề của tôi. Cảm ơn!! Đây thực sự là một thay đổi rất tò mò. – Alexander

+0

Vấn đề của tôi là tôi đã chỉ định 'picker.delegate = self' thay vì' picker.peoplePickerDelegate = self'. – kev

+0

@Rob Xin chào sir tôi đang làm tất cả tiền phạt trong dự án của tôi tôi chỉ định peoplePickerDelegate trên phương pháp bấm nút, nhưng bây giờ phương pháp hủy bỏ hoạt động tốt nhưng (BOOL) peoplepickernavigationcontroller không được gọi. –

2

above two delegate methods are deprecated in ios 8.0, use use methods last two for getting your desire result

trên hai phương pháp đại biểu đang bị phản đối trong iOS 8.0, sử dụng hai phương pháp cuối cùng để có được kết quả mong muốn của bạn

này được liên kết phát triển táo phương châm cung cấp cho bạn thêm thông tin về

ABPeoplePickerNavigationControllerDelegate

0

Không có gì xảy ra khi tôi chọn một liên hệ trong IOS8.

tôi thấy rằng ngoài việc

if ([picker respondsToSelector:@selector(setPredicateForSelectionOfPerson:)]) 
    { 
     picker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"[email protected] = 1"]; 
    } 

tôi cũng cần

if ([picker respondsToSelector:@selector(setPredicateForEnablingPerson:)]) 
    { 
     picker.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
    } 

Nguồn https://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/PeoplePicker_AAPL_8or7_EmailPickerViewController_m.html

0

nếu bạn muốn chỉ nhận được tên của người đó, bạn có thể làm điều này:

-(IBAction)btnGetContact{ 
    ABPeoplePickerNavigationController *personPicker = [ABPeoplePickerNavigationController new]; 
    personPicker.peoplePickerDelegate = self; 
    [self presentViewController:personPicker animated:YES completion:nil]; 
} 

-(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{ 
     NSString *firstName; 
    NSString *middleName; 
    NSString *lastName; 
    UIImage *retrievedImage; 

    // get the first name 
    firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 

    //get the middle name 
    middleName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty); 

    // get the last name 
    lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 

    // get personPicture 
    if (person != nil && ABPersonHasImageData(person)) 
    { 
     retrievedImage = [UIImage imageWithData:(__bridge_transfer NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)]; 
    } 
    else 
    { 
     retrievedImage = nil; 
    } 
} 

Nhưng nếu bạn đang tìm kiếm để đi đến từng chi tiết của người để có được số người, bạn nên sử dụng BOOL thay void cho peoplePickerNavigationController và vượt qua YES như dưới đây:

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{ 
    return YES; 
} 



-(void) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{ 
     ABMutableMultiValueRef phoneno = ABRecordCopyValue(person, kABPersonPhoneProperty); 

CFStringRef phone = ABMultiValueCopyValueAtIndex(phoneno, identifier); 

     _mPhone.text = (__bridge NSString *)phone; 

     [self dismissViewControllerAnimated:NO completion:^(){}]; 
    } 

Cũng không quên nhập AddressBook.frameworkAddressBookUI.framework để dự án của bạn và ABPeoplePickerNavigationControllerDelegate ,

#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 

vào tệp tiêu đề của bạn.

Các vấn đề liên quan