ABPeoplePickerNavigationController меняется с iOS8? - программирование
Подтвердить что ты не робот

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. есть у кого-то еще решение для этого?

4b9b3361

Ответ 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

}