2016-09-22 5 views
1

Ich versuche, die modernere CNContactPickerViewController zu verwenden, um einen Kontakt auszuwählen. Wenn der Kontakt mehrere Adressen hat, möchte ich, dass der Benutzer nur eine der Adressen auswählen kann. Wenn eine Adresse speziell ausgewählt ist, möchte ich auch das Objekt erhalten.Wie verwende ich CNContactPickerViewController, um Adresse und Kontakt zu erhalten?

ich dies tun könnte die veralteten ABPeoplePickerNavigationControllerDelegate verwenden, wo diese Delegatfunktion verfügbar war:

func peoplePickerNavigationController(_ peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier) 

Wenn jedoch CNContactPickerViewController Verwendung nur diese relevante Delegatfunktion steht zur Verfügung:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) 

Beachten Sie, dass Es gibt kein CNContact Objekt zurückgegeben. Ich bekomme die CNPostalAddress in der contactProperty, aber ich erhalte den Datensatz des besitzenden Kontakts nicht.

Hier ist der Code, den ich mit ABPeoplePickerNavigationController verwendet:

let peoplePicker = ABPeoplePickerNavigationController() 

    peoplePicker.peoplePickerDelegate = self 

    peoplePicker.displayedProperties = [NSNumber(value: kABPersonAddressProperty as Int32), NSNumber(value: kABPersonBirthdayProperty as Int32)] 

    peoplePicker.predicateForSelectionOfPerson = NSPredicate(format: "[email protected] <= 1") 

    peoplePicker.modalPresentationStyle = UIModalPresentationStyle.currentContext 

    self.present(peoplePicker, animated: true, completion: nil) 

... und hier ist der Code mit CNContactPickerViewController:

let contactPicker = CNContactPickerViewController() 

    contactPicker.delegate = self 

    contactPicker.displayedPropertyKeys = [CNContactPostalAddressesKey, CNContactBirthdayKey] 

    contactPicker.predicateForSelectionOfContact = NSPredicate(format: "[email protected] <= 1") 

    contactPicker.modalPresentationStyle = UIModalPresentationStyle.currentContext 

    self.present(contactPicker, animated: true, completion: nil) 

Also, für mich, es wie die gleiche Funktionalität aussieht, ist nicht mehr verfügbar im neueren Contacts Framework, aber ich überprüfe hier, ob ich etwas verpasst habe.

+0

Mein Fehler war die CNPostalAddress für eine "Kontakt" -Eigenschaft. Anstatt auf die contactProperty zu schauen. – Daniel

Antwort

3

Beachten Sie, dass kein Objekt zurückgegeben wird. Ich bekomme die CNPostalAddress in der contactProperty, aber ich erhalte nicht den Datensatz des besitzenden Kontakts.

Das CNContact Objekt kann von der contact Eigenschaft der CNContactProperty abgerufen werden, so ...

Wenn jedoch CNContactPickerViewController verwenden, nur diese relevante Delegatfunktion steht zur Verfügung:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) 

... die Implementierung dieser Delegate-Methode würde es Ihnen ermöglichen, was y zu tun du willst. Aber Sie wollen, stellen Sie sicher, dass Sie nicht Durchführung der anderen Delegatmethoden, wie zum Beispiel:

func contactPicker(CNContactPickerViewController, didSelect: CNContact) 

die dem Kommissionierer den Moment einen Kontakt (und nicht seine Eigenschaft) gewählt ist, wird entlassen.

1

Hinweis, dass es keine CNContact ist Objekt

Sie sind das nur falsch. Die Delegate-Methode ist contactPicker(_:didSelect:), es übergibt Ihnen eine CNContactProperty und die CNContactProperty übergibt Ihnen den gesamten CNContact und alle seine Eigenschaften.

Verwandte Themen