由于我已将iPhone上的XCode(6.0,6A313)和我的iOS(8.0,12A365)更新为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的iOS开发者库中找不到任何答案。 别人有解决方案吗?
答案 0 :(得分:79)
iOS 8需要为此实现新的委托方法:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
}
保留旧的委托方法以支持iOS 7或更早版本。我在我的应用程序中执行的操作是从iOS 8委托方法调用iOS 7委托方法:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
[self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier];
}
如果此代理方法未在iOS 8中实施,则点击该值会导致操作。实现时,将使用所选值调用委托。
答案 1 :(得分:13)
另请参阅委托方法,iOS8的新功能:
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person;
{
[self selectedPerson:person];
}
这就是我想要的东西。
答案 2 :(得分:1)
这适用于iOS 8和iOS 7及更低版本。
注意我正在使用这个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
}