Отображение 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, чтобы включить все контакты, у которых есть адрес электронной почты, чтобы стать доступными. Если предикат не установлен для этого свойства, все контакты становятся доступными.

  • UITableView внутри UIPickerView в iOS
  • Проблемы с задержкой CABasicAnimation с IOS 5 и RemoteIO
  • Уровни класса AutoLayout - разные пропорциональные высоты
  • Почему приложение iOS для Facebook не получает уведомления для запросов приложений?
  • Поддерживает ли веб-браузер SFSafariViewController и Safari общий доступ к файлам cookie и веб-хранилищу?
  • экспорт открытого ключа из доступа к цепочке ключей
  • Запись AVCaptureSession Пауза и возобновление записи
  • Border TextField
  • Выпадающее меню Boostrap, не работающее над CERTAIN iphones
  • Есть ли способ увидеть файловую систему на симуляторе iOS?
  • Поворот по повороту Навигация в iOS 7
  • Interesting Posts

    Как получить файл при подключении к успеху в TURNSocket XMPPFramework в ios?

    Pager Sliding TabStrip в ios

    Как я мог клонировать / дублировать UIView для iOS?

    Загрузите html-файл в WebView из локальной настраиваемой папки в swift 3

    Фильтр CIPerspectiveCorrection возвращает изображение, перевернутое и перевернутое

    Вставить segue – динамически переключать начальный UIViewController и содержащий UIViewController динамически

    Как сделать несколько цветных вкладок в swift 3

    Быстро, как обнаружить прикосновение во время воспроизведения видео в AVPlayerViewController

    Swift 3: Почему символ _ добавляется перед отправителем в параметры действия?

    ld: 1 дубликат символа для архитектуры x86_64 build failed

    Проверка наличия файла в комплекте

    UIWIndow не объявлен iOS 4.3 AppDelegate

    Почему мой UIView не растет с CGAffineTransformMakeScale?

    Первый текст UITextview не отображается

    UICollectionView и дополнительный просмотр (заголовок)

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