Создать новый контакт и добавить к существующему контакту для CNContactViewController()

С помощью ABAddressBook, когда я хотел, чтобы у пользователя была возможность «Создать новый контакт» и «Добавить к существующему контакту» для контакта, которого он раньше не видел, я создавал и представлял ABUnknownPersonViewController.

Я не могу найти способ воспроизвести эту функциональность в рамках CNContacts. Мне казалось, что CNContactViewController(forUnknownContact: contact) может работать, но, к сожалению, это позволяет пользователю только «Отправить сообщение» или «Поделиться контактом».

Как разрешить пользователю сохранять контакт в своей адресной книге как новый контакт или как часть существующего в CNContacts?

func presentContact() {

    let status = CNContactStore.authorizationStatusForEntityType(.Contacts)

    switch status {
    case .Authorized: ()
    case .NotDetermined: requestAccess()
    case .Denied, .Restricted: accessDenied()
    }

    print("authorized? \(status == .Authorized)") //prints "authorized? true"

    let unknown = CNContactViewController(forUnknownContact: contact!)

    unknown.delegate = self

    self.navigationController?.pushViewController(unknown, animated: false)

}

Даже когда я пытаюсь запросить доступ, пользователь все равно не может сохранить контакт.


person 5813    schedule 28.08.2016    source источник
comment
Потому что вы не показываете реальный код. Покажи свой код! Вы по-прежнему пропускаете всевозможные важные части, и я не могу сказать, потому ли это, что вы не знаете, что должны их делать, или потому, что вам просто лень вставлять свой код в Stack Overflow. Что такое contact? Покажите строку, в которой вы установили unknown contactStore. Все эти вещи важны. ПОКАЗАТЬ. ТВОЙ. НАСТОЯЩИЙ. КОД.   -  person matt    schedule 28.08.2016
comment
Какие важные части я все еще упускаю? contact — это произвольное CNContact с любым набором свойств. Я не уверен, как это может повлиять на то, что кнопки действий не отображаются. Здесь есть все, кроме установленного свойства unknown contactStore, что и является проблемой. Спасибо за вашу помощь. Извините, если я срезал некоторые углы при создании минимального воспроизводимого примера; Я старался сделать его максимально простым и понятным.   -  person 5813    schedule 28.08.2016
comment
Я бы принял это как ответ - или ответ, который вы опубликовали, если бы он все еще существовал, - потому что установка contactStore правильно решила проблему.   -  person 5813    schedule 28.08.2016


Ответы (3)


Вы постоянно не показываете свой настоящий код, поэтому помочь вам невозможно. Так что я потерял интерес. Вместо этого я просто покажу вам мой реальный код и оставлю вас изучать его и думать о разнице между тем, что делаю я, и тем, что делаете вы. Вот фактический рабочий код; идите и поступайте так же:

let con = CNMutableContact()
con.givenName = "Johnny"
con.familyName = "Appleseed"
con.phoneNumbers.append(CNLabeledValue(
    label: "woods", value: CNPhoneNumber(stringValue: "555-123-4567")))
let unkvc = CNContactViewController(forUnknownContact: con)
unkvc.message = "He knows his trees"
unkvc.contactStore = CNContactStore()
unkvc.delegate = self
unkvc.allowsActions = false
self.navigationController?.pushViewController(unkvc, animated: true)

введите описание изображения здесь

person matt    schedule 28.08.2016
comment
Однако остерегайтесь ошибки, которую я описываю здесь: stackoverflow.com/q/32973254/341994 - person matt; 28.08.2016
comment
То, что написано выше, на самом деле, на самом деле — это мой настоящий код. Строка за строкой, слово в слово, вот что у меня есть в одном из моих .swift файлов. Не установить contactStore было проблемой; ты мне помог. - person 5813; 28.08.2016
comment
Работал для меня !! - person Pratik Pitale; 17.08.2018
comment
кнопка "назад" не появляется! Все остальное работает нормально. Можете ли вы дать мне обходной путь, как показать кнопку «Назад». Мое приложение отображается только на этом экране. - person Zahurafzal Mirza; 29.08.2018
comment
@ZahurafzalMirza Потому что вы не внутри навигационного контроллера. - person matt; 29.08.2018
comment
Бро, я внутри навигационного контроллера, но кнопки не отображаются. Однако в итоге я добавил элемент кнопки левой панели для своей проблемы. - person Zahurafzal Mirza; 31.08.2018

CNContactStore *store = [[CNContactStore alloc] init];
CNMutableContact *contact = [[CNMutableContact alloc] init];
CNPhoneNumber * number  = [[CNPhoneNumber alloc] initWithStringValue:@"1234567890"];
CNLabeledValue * labelValue = [[CNLabeledValue alloc]initWithLabel:CNLabelPhoneNumberMobile value:number];
NSMutableArray<CNLabeledValue *> *phoneNumbers = [NSMutableArray new];
[phoneNumbers addObject:labelValue];
contact.phoneNumbers = phoneNumbers;
CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:contact];

controller.contactStore = store;
controller.delegate = self;

[self presentViewController:[[UINavigationController alloc] initWithRootViewController:controller] animated:YES completion:nil];

Этот код будет работать для «Создать новый контакт», для «Добавить к существующему контакту» нам придется использовать CNContactPickerViewController.

CNContactPickerViewController * picker = [[CNContactPickerViewController alloc] init];
                                    picker.delegate = self;
                                    [self presentViewController:picker animated:YES completion:nil];

и в методе делегата

- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact
{
    CNContactStore *store = [[CNContactStore alloc] init];
    CNMutableContact *existingContact = [(CNMutableContact*)contact mutableCopy];
    CNPhoneNumber * number  = [[CNPhoneNumber alloc] initWithStringValue:@"1234567890"];
    CNLabeledValue * labelValue = [[CNLabeledValue alloc]initWithLabel:CNLabelPhoneNumberMobile value:number];
    NSMutableArray<CNLabeledValue *> *phoneNumbers = [NSMutableArray new];
    [phoneNumbers addObject:labelValue];
    [phoneNumbers addObjectsFromArray:existingContact.phoneNumbers];
    existingContact.phoneNumbers = phoneNumbers;
    CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:existingContact];

    controller.contactStore = store;
    controller.delegate = self;

    dispatch_async(dispatch_get_main_queue(), ^
    {
        [self presentViewController:[[UINavigationController alloc] initWithRootViewController:controller] animated:YES completion:nil];
    });

}

хотя он будет отображать кнопку «Готово» вместо «Обновить», но он будет выполнять функции, определенные как поведение iPhone по умолчанию в приложении «Контакты».

person Raja Saad    schedule 26.12.2018
comment
Вопрос помечен Swift, а не Objective-C. Пожалуйста, опубликуйте пример Swift. Спасибо. - person Eric Aya; 27.12.2018
comment
@Moritz, чтобы просто иметь представление о том, что делать, кода Objective-C достаточно, и для разработчика не составляет большого труда понять код, будь то Swift или Objective-C, плюс есть инструменты, которые могут преобразовать код , так плз.. - person Raja Saad; 28.12.2018
comment
Я только что прошел через это и поделился тем, что я реализовал недавно, когда у меня будет свободное время, я тоже это сделаю. - person Raja Saad; 31.12.2018

Чего вам не хватает в вашем коде, так это установки свойства contactStore вашей переменной unknown в дескриптор CNContactStore.

[...]

unknown.contactStore = CNContactStore()

[...]
person Community    schedule 15.11.2016