2015-10-16 87 views
4

我使用新的CNContactPickerViewController从地址簿中选择联系人并在我的应用中使用它们。iOS9 - CNContactPickerViewController:预选联系人

当我按下一个按钮,我把这个代码:

let contactPicker = CNContactPickerViewController() 
     contactPicker.delegate = self 
     contactPicker.predicateForEnablingContact = NSPredicate(format: "[email protected] > 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数组“(基本上,电子邮件地址字符串的浪花)

这里是结果: enter image description here

这工作正常。但是,如果我之前选择了联系人,我希望contactPicker在初始化联系人时预先选择联系人,也就是说,在联系人出现时显示联系人。 有没有办法做到这一点?

感谢

回答

1

我想你问的联系人框架来管理,它不是设计来处理一些额外的状态。您的“选定”状态标记在CNContact object(请参阅下面的列表CNKeyDescriptor列表)上不可用,因此无法显示在选取器视图控制器中。

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

CNKeyDescriptor的名单,据我可以告诉:

// 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 
+0

这的确是标准的CNContactPickerViewController(在模拟器中)。 感谢您的CNKeyDescriptors列表,始终有用。 –

1

使用谓词。保持先前选择的CNContact标识符数组,然后把这样的断言:在输入电子邮件地址

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

和示例,只显示联系人:

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

感谢您的回答。您的解决方案禁用先前选定的联系人我想要的是在联系人选择器出现时将他们显示为选中的方式。 –