2017-01-12 2 views
2

Я знаю, как выбрать контакт в iOS (с помощью CNContactPickerViewController), но как я могу выбрать конкретный номер телефона для контакта, а не самого контакта в целом? Это должно быть возможно, согласно документам, но я не узнал, как это сделать.Как я могу выбрать номер контактного телефона в iOS?

EDIT: вот мой код

CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init]; 

contactPicker.delegate = self; 
contactPicker.displayedPropertyKeys = @[CNContactGivenNameKey, CNContactImageDataAvailableKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactThumbnailImageDataKey, CNContactIdentifierKey]; 

[self presentViewController:contactPicker animated:YES completion:nil]; 

Итак, я установить displayedProperties, но результат тот же, даже если я выбираю только CNContactPhoneNumbersKey, я не представлены с номерами всех контактных, так что я может выбрать специальный номер.

Что мне не хватает?

EDIT 2: методы обратного вызова в соответствии с запросом. Я не знаю, какое значение они имеют, но тем не менее.

-(void) contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{ 
    //NSLog(@"Contact : %@",contact); 
    NSString* contactName = [NSString stringWithFormat:@"%@%@%@", contact.givenName, @" ", contact.familyName]; 
    [currentButton setTitle:contactName forState:UIControlStateNormal]; 
    [currentName setText:contactName]; 
... 
} 

-(void) contactPickerDidCancel:(CNContactPickerViewController *)picker { 
    //NSLog(@"Cancelled"); 
} 
+0

каждый контакт имеет множество телефонных номеров, поиск по массиву, чтобы выбрать определенный номер телефона –

+1

Ну, я мог бы также искать через множество контактов и выберите конкретный, но гораздо удобнее иметь сборщик. В Android вы можете выбрать номер, и, согласно документам, то же самое касается и iOS, я прочитал в документах: «Объект CNContactPicker отображает системный интерфейс на основе popover для выбора контакта. Методы и свойства этого класса помогите выбрать контакт или значение контакта, например номер телефона или адрес электронной почты, контакта ». – Eir

ответ

5

ОК, вот ответ:

Прежде всего, следует использовать только свойство, которое вы хотите выбрать в displayedPropertyKeys (в данном случае это CNContactPhoneNumbersKey), и убедитесь, что для реализации всех методов делегата (т.е. как didSelectContact - когда контакт имеет только один номер телефона и didSelectContactProperty - если контакт имеет более одного номера телефона).

Furhtermore, ограничивает выбор контакта путем установки:

contactPicker.predicateForEnablingContact = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
contactPicker.predicateForSelectionOfContact = [NSPredicate predicateWithFormat:@"[email protected] == 1"]; 
contactPicker.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"key == 'phoneNumbers'"]; 
+0

Спасибо Eir. Это все еще не работает в моем случае.У меня здесь очень простой код: contactPicker = [[CNContactPickerViewController alloc] init]; [contactPicker setDisplayedPropertyKeys: @ [CNContactPhoneNumbersKey]]; , а затем я делаю предикат, как вы сказали. Но я получаю сообщение об ошибке для последнего predicateForSelectionOfProperty, который говорит: «Ошибка домена = CNErrorDomain Code = 400 \« Недопустимый предикат ». UserInfo = {CNKeyPaths = (\ n номер телефона \ n), NSLocalizedDescription = Неверный предикат" Я пробовал сделать он phoneNumbers, он по-прежнему дает мне ту же ошибку «Неверный предикат» – Pankaj

+0

Я также пробовал этот предикат с апострофом, то есть [NSPredicate predicateWithFormat: @ »key == 'phoneNumber'"], при этом ошибка недопустимого предиката уходит, но мой выбор по-прежнему не основан на собственности, он основан на контактах. Похоже, что мне нужно пропустить какую-то другую часть, я проверил, что я правильно настроил делегат, и также выполнял didSelectContacts и didSelectContactProperties (я хочу, чтобы несколько вариантов выбора). – Pankaj

+0

Что я написал, это рабочий код. Может быть, у вас есть опечатка? Или вы ориентируетесь на старую версию iOS? – Eir

0

Вы должны установить displayedKeys свойство CNContactPicker. Если вы не устанавливаете какие-либо клавиши, вы можете выбрать только контакт. Если вы установили ключи, вы выбираете контакт, а затем выбираете желаемое свойство контакта.

Внедрите соответствующие методы делегата для завершения процесса.

+0

Спасибо за ответ! Я устанавливаю showPropertyKeys, но безуспешно. Я отправил свой код, может быть, вы могли бы обнаружить проблему? – Eir

+0

Внедрили ли вы надлежащие методы делегирования? Обновите свой вопрос с помощью методов делегата, которые вы внедрили. BTW - в вашем вопросе говорится, что вы используете 'CNContactPicker', но ваш код показывает вам использование' CNContactPickerViewController'. – rmaddy

+0

Я опубликовал реализацию методов делегата. Какая разница в этой проблеме между использованием CNContactPicker и CNContactPickerViewController? Оба утверждают, что имеют возможность выбрать свойство контакта, и оба принимают те же аргументы. – Eir

Смежные вопросы