iOS9 - CNContactPickerViewController : 预选联系人

Posted

技术标签:

【中文标题】iOS9 - CNContactPickerViewController : 预选联系人【英文标题】:iOS9 - CNContactPickerViewController : pre-select contacts 【发布时间】:2016-01-15 06:13:51 【问题描述】:

我使用新的 CNContactPickerViewController 从通讯录中选择联系人并在我的应用中使用它们。

当我按下一个按钮时,我调用这个代码:

let contactPicker = CNContactPickerViewController()
        contactPicker.delegate = self
        contactPicker.predicateForEnablingContact = NSPredicate(format: "emailAddresses.@count > 0")
        presentViewController(contactPicker, animated: true, completion: nil)

并且我使用了下面的 CNContactPickerDelegate 方法来选择多个联系人:

func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) 

    selectedRecipients = contacts.map  $0.emailAddresses.first!.value as! String 
    tableView.reloadData()


这有助于我填充一个名为“selectedRecipients”的数组(基本上是一个 emailAddresses 字符串数组)

结果如下:

这很好。但是,如果我之前选择了联系人,我希望contactPicker 在初始化时预先选择联系人,即在出现时将联系人显示为已选择。 有没有办法做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

我认为您是在要求 Contacts Framework 管理一些它无法处理的额外状态。您的“已选择”状态标志在 CNContact object 上不可用(请参阅下面的 CNKeyDescriptor 列表),因此无法在选择器视图控制器中显示。

在我看来,如果您想将这种额外状态添加到您的应用中,您将需要推出自己的解决方案。

据我所知CNKeyDescriptors 的列表:

// Properties that are always fetched. Can be used with key value coding and observing.
@available(ios 9.0, *)
public let CNContactIdentifierKey: String

// Optional properties that can be fetched. Can be used with key value coding and observing.
@available(iOS 9.0, *)
public let CNContactNamePrefixKey: String
@available(iOS 9.0, *)
public let CNContactGivenNameKey: String
@available(iOS 9.0, *)
public let CNContactMiddleNameKey: String
@available(iOS 9.0, *)
public let CNContactFamilyNameKey: String
@available(iOS 9.0, *)
public let CNContactPreviousFamilyNameKey: String
@available(iOS 9.0, *)
public let CNContactNameSuffixKey: String
@available(iOS 9.0, *)
public let CNContactNicknameKey: String
@available(iOS 9.0, *)
public let CNContactPhoneticGivenNameKey: String
@available(iOS 9.0, *)
public let CNContactPhoneticMiddleNameKey: String
@available(iOS 9.0, *)
public let CNContactPhoneticFamilyNameKey: String
@available(iOS 9.0, *)
public let CNContactOrganizationNameKey: String
@available(iOS 9.0, *)
public let CNContactDepartmentNameKey: String
@available(iOS 9.0, *)
public let CNContactJobTitleKey: String
@available(iOS 9.0, *)
public let CNContactBirthdayKey: String
@available(iOS 9.0, *)
public let CNContactNonGregorianBirthdayKey: String
@available(iOS 9.0, *)
public let CNContactNoteKey: String
@available(iOS 9.0, *)
public let CNContactImageDataKey: String
@available(iOS 9.0, *)
public let CNContactThumbnailImageDataKey: String
@available(iOS 9.0, *)
public let CNContactImageDataAvailableKey: String
@available(iOS 9.0, *)
public let CNContactTypeKey: String
@available(iOS 9.0, *)
public let CNContactPhoneNumbersKey: String
@available(iOS 9.0, *)
public let CNContactEmailAddressesKey: String
@available(iOS 9.0, *)
public let CNContactPostalAddressesKey: String
@available(iOS 9.0, *)
public let CNContactDatesKey: String
@available(iOS 9.0, *)
public let CNContactUrlAddressesKey: String
@available(iOS 9.0, *)
public let CNContactRelationsKey: String
@available(iOS 9.0, *)
public let CNContactSocialProfilesKey: String
@available(iOS 9.0, *)
public let CNContactInstantMessageAddressesKey: String

【讨论】:

确实是标准的CNContactPickerViewController(在模拟器中)。感谢 CNKeyDescriptors 列表,总是有用的。【参考方案2】:

使用谓词。保留之前选择的 CNContact 标识符数组,然后像这样发送谓词:

contactPicker.predicateForEnablingContact = [NSPredicate predicateWithFormat:@"!(identifier IN %@)", arrayOfPreviouslySelected];

以及仅显示具有电子邮件地址的联系人的示例:

contactPicker.predicateForEnablingContact = [NSPredicate predicateWithFormat:@"!(identifier IN %@) && emailAddresses.@count > 0", arrayOfPreviouslySelected];

【讨论】:

感谢您的回答。您的解决方案会禁用以前选择的联系人。我想要的是一种在联系人选择器出现时将它们显示为选中状态的方法。

以上是关于iOS9 - CNContactPickerViewController : 预选联系人的主要内容,如果未能解决你的问题,请参考以下文章

iOS9新特性

iOS 适配iOS9

iOS9新特性

iOS9新特性

关于iOS9之后的loadViewIfNeeded

iOS9 的 UILocalNotification 问题