ABPeoplePickerNavigationController меняется с iOS8?
Так как я обновил XCode (6.0, 6A313) и мою iOS (8.0, 12A365) на семенах iPhone до gm, код ABPeoplePickerNavigationController не работает, как раньше.
-
iOS 7.1.2. Если кто-то хочет импортировать контакт, откроется адресная книга и вы увидите полный список контактов, после выбора одного из них открывается подробный вид контакта, и вы можете добавить контакт щелкнув номер телефона, который вы хотите импортировать.
-
iOS 8.0: все это похоже, но если вы нажмете на номер контакта, наберите номер телефона, а не импортируете его.
код:
#pragma mark - AddressBook Delegate Methods
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
return YES;
}
-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
// Get the first and the last name. Actually, copy their values using the person object and the appropriate
// properties into two string variables equivalently.
// Watch out the ABRecordCopyValue method below. Also, notice that we cast to NSString *.
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
// Compose the full name.
NSString *fullName = @"";
// Before adding the first and the last name in the fullName string make sure that these values are filled in.
if (firstName != nil) {
fullName = [fullName stringByAppendingString:firstName];
}
if (lastName != nil) {
fullName = [fullName stringByAppendingString:@" "];
fullName = [fullName stringByAppendingString:lastName];
}
// Get the multivalue number property.
CFTypeRef multivalue = ABRecordCopyValue(person, property);
// Get the index of the selected number. Remember that the number multi-value property is being returned as an array.
CFIndex index = ABMultiValueGetIndexForIdentifier(multivalue, identifier);
// Copy the number value into a string.
NSString *number = (__bridge NSString *)ABMultiValueCopyValueAtIndex(multivalue, index);
nameTextField.text = fullName;
numberTextField.text = number;
// Dismiss the contacts view controller.
[_addressBookController dismissViewControllerAnimated:YES completion:nil];
return NO;
}
// Implement this delegate method to make the Cancel button of the Address Book working.
-(void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{
[_addressBookController dismissViewControllerAnimated:YES completion:nil];
}
не удалось найти ответ в библиотеке разработчиков iOS для Apple.
есть у кого-то еще решение для этого?
Ответы
Ответ 1
iOS 8 требует для этого нового метода делегата:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
}
Сохраните старый метод делегирования для поддержки iOS 7 или более ранней версии. То, что я делаю в своем приложении, вызывает метод делегата iOS 7 из метода делегата iOS 8:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
[self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier];
}
Если этот метод делегата не реализован в iOS 8, нажатие на значение вызывает действие. Когда реализовано, делегат вызывается вместо этого с выбранным значением.
Ответ 2
См. также метод делегата, новый с iOS8:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person;
{
[self selectedPerson:person];
}
Это то, что я хотел в моем случае.
Ответ 3
Это работало для меня как на iOS 8, так и на iOS 7 и ниже.
Примечание. Вместо этого я использую this didSelectPerson: (ABRecordRef).
//Needed for iOS 8
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
NSLog(@"Went here 1 ...");
[self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person];
}
//needed for iOS 7 and lower
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
NSLog(@"Went here 2 ...");
//add your logic here
}