2014-09-24 18 views
6

Ho una sottoclasse di ABPeoplePickerNavigationController per gestire la selezione di un numero di telefono di contatto nella mia app. Tutto funziona alla grande su iOS 7 e versioni successive.Impossibile selezionare il contatto su iOS 8

Su iOS 8, tuttavia, il mio ABPeoplePickerNavigationControllerDelegate non viene colpito quando si seleziona un numero di telefono. Invece, chiama solo quel numero di telefono.

Ho notato che il metodo che stavo usando per gestire la selezione dei contatti in iOS 7 (peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:) era obsoleto in iOS 8. Questo metodo è stato sostituito da peoplePickerNavigationController:didSelectPerson:property:identifier:.

So che il mio delegato è impostato perché ricevo il callback del metodo peoplePickerNavigationControllerDidCancel:.

Qualcun altro ha riscontrato questo problema?

Ecco un frammento di codice del mio ABPeoplePickerNavigationController sottoclasse:

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

Cosa hai specificato 'predicateForSelectionOfProperty'? – Rob

+0

Stai creando Xcode 6 e il tuo progetto ha un SDK di base di iOS 8? – rmaddy

+0

@Rob Nothing. Ha sempre funzionato senza impostarlo. – Alexander

risposta

6

Dove stai specificando il peoplePickerDelegate?

In iOS 8, se si specifica peoplePickerDelegate in viewDidLoad, potrete sperimentare il comportamento curioso che si descrive (annulla delegato funziona, il didSelect... e shouldContinue... no). Se si specifica peoplePickerDelegate immediatamente dopo init (o durante), funziona correttamente.

Questa sembra essere una "caratteristica" di iOS 8. Presenterò un bug report.

+0

Questo era il mio problema. Grazie!! Questo è davvero un cambiamento molto curioso. – Alexander

+0

Il mio problema era che stavo specificando 'picker.delegate = self' invece di' picker.peoplePickerDelegate = self'. – kev

+0

@Rob Ciao signore sto facendo tutto bene nel mio progetto ho specificato peoplePickerDelegate sul metodo click del pulsante, ma ora il metodo cancella funziona bene ma (BOOL) non viene chiamato peoplepickernavigationcontroller. –

2

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

sopra due metodi delegato sono deprecati in iOS 8.0, utilizzano ultimi due metodi per ottenere il risultato desiderio

questo è collegamento linea guida per sviluppatori di Apple vi darà ulteriori informazioni su

ABPeoplePickerNavigationControllerDelegate

0

Non succede nulla quando ho selezionato un contatto in IOS8.

ho scoperto che oltre a

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

Ho anche bisogno

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

Fonte https://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/PeoplePicker_AAPL_8or7_EmailPickerViewController_m.html

0

se si vuole solo ottenere il nome della persona si può fare questo:

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

Ma se si sta cercando di andare nei dettagli di persona per ottenere i numeri della persona, è necessario utilizzare BOOL invece void per peoplePickerNavigationController e superare YES come di seguito:

-(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:^(){}]; 
    } 

Inoltre non dimenticate di importare AddressBook.framework e AddressBookUI.framework al progetto e ABPeoplePickerNavigationControllerDelegate ,

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

nel file di intestazione.

Problemi correlati