Отображение ABAddressBook с контактами, имеющими только электронную почту

Я хочу отобразить ABAddressBook, который показывает только контакты с электронной почтой, поэтому я попробовал что-то вроде этого:

ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBook ); for( CFIndex emailIndex = 0; emailIndex < nPeople; emailIndex++ ) { ABRecordRef person = CFArrayGetValueAtIndex( allPeople, emailIndex ); ABMutableMultiValueRef emailRef=ABRecordCopyValue(person, kABPersonEmailProperty); int emailCount = ABMultiValueGetCount(emailRef); if(emailCount == 0) { ABAddressBookRemoveRecord(addressBook, person, NULL); } } ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.addressBook = addressBook; picker.peoplePickerDelegate = self; [self presentModalViewController:picker animated:YES]; 

Контроллер показывает, но отображаются все контакты, и если я выберу те, у кого нет письма, я получаю сбой. Если я вызываю ABAddressBookSave (), он удаляет все контакты с помощью электронной почты, но это постоянное изменение, которое даже удаляет их из системных контактов. Каков правильный способ сделать это?

5 Solutions collect form web for “Отображение ABAddressBook с контактами, имеющими только электронную почту”

Возможно, вам понадобится создать массив контактов, имеющих электронную почту, а затем отобразить их на UITableViewController. Это способ построения такого массива: https://stackoverflow.com/a/13980023/745862 . Вы можете использовать ABPersonViewController или ABUnknownPersonViewController для отображения контактной информации.

Рассматривали ли вы создание временной адресной книги и заполнение ее контактами с адресами электронной почты?

Вы удаляете все контакты без адреса электронной почты из AddressBook, но не сохраняете адресную книгу в конце. Когда AddressBook загружается из ABPeoplePickerNavigationController, все предыдущие изменения будут потеряны! Попробуй это:

 if (ABAddressBookHasUnsavedChanges(addressBook)) ABAddressBookSave(addressBook, NULL) 

BTW, не забудьте CFRelease () адресную книгу, allPeople и emailRef.

Вы пытались показать значения электронной почты только следующим образом:

 ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; picker.displayedProperties = @[@(kABPersonEmailProperty)]; 

Возможно, это уже делает, чего вы хотите? Однако не проверял.

Из iOS 8 у ABPeoplePaverNavigationController есть свойство, которое разрешает вашу проблему:

 @property (nonatomic,copy) predicateForEnablingPerson 

Пример кода из документа Apple: https://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/Peopleer_AAPL_8or7_EmailPickerViewController_m.html )

 ABPeoplePickerNavigationController* abPicker = [ABPeoplePickerNavigationController new]; abPicker.peoplePickerDelegate = self; //... if ([abPicker respondsToSelector:@selector(setPredicateForEnablingPerson:)]){ // The people picker will enable selection of persons that have at least one email address. abPicker.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"]; } 

Обратите внимание, что из iOS9 ABPeoplePaverNavigationController устарел, вы можете использовать новый CNContactPickerViewController так же, как и свойство:

 @property(nonatomic, copy) NSPredicate *predicateForEnablingContact 

Из документа:

Вы можете установить значение для этого свойства, чтобы определить, какой контакт должен быть выбран, например, адрес электронной почты. @ Count> 0, чтобы включить все контакты, у которых есть адрес электронной почты, чтобы стать доступными. Если предикат не установлен для этого свойства, все контакты становятся доступными.

  • Как отклонить UIPopoverController?
  • Недопустимое изображение. Для приложений iOS значки, включенные в двоичную подачу, должны быть в формате PNG
  • ярлык не доступен для кликов в jqtouch
  • Устранение отклонения родительского представления за статусной строкой
  • разделенные запятыми тысячи NSString stringWithFormat
  • Мое приложение не показывает никаких отзывов и оценок в App Store?
  • Раскадровка Segue для нескольких просмотров?
  • отсутствие значков для iPad / iPhone при загрузке приложения на itunes connect libgdx
  • Как проигрывать видеопоток с помощью MPMoviePlayerController в iOS
  • Найти / заменить в Xcode с помощью регулярного выражения
  • CocoaAsyncSocket не работает после того, как он находится в фоновом режиме
  • Interesting Posts

    libc ++ abi.dylib: завершение с неперехваченным исключением типа NSException (lldb)

    Где хранить файл основных данных?

    отправить запрос ARP и получить ответ ARP

    UINavigationController с фоновым изображением, которое остается неподвижным и не оживляется при нажатии или просмотре контроллеров представления

    Может ли приложение iOS для универсального приложения поддерживать несколько приложений с использованием одного и того же домена?

    Xcode 5 – больше не может проверять архивы

    UITableView tableFooterView может привести к сбою?

    Хранение данных в приложении Swift iOS для последующего использования

    MKMapView, как рассчитать высоту в метрах?

    ReactiveCocoa- Как избавиться от сигнала с помощью «switchToLatest»?

    Как повернуть видео с UIImagePickerController перед загрузкой на веб-сервер

    UISearchBar обнаруживает, когда пользователь останавливает тип и не выполняет поиск немедленно, поэтому обнаруживает паузу

    Как уволить несколько currentModalViewControllers и вернуться к корневому контроллеру панели вкладок?

    Можно использовать «self» с NSSortDescriptor для сортировки по самому объекту, а не по объекту? (Основные данные / NSFetchedResultsController)

    Ошибка при воспроизведении видео в MPMoviePlayerController

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.