CNContactPickerDelegate包含五个代理方法。下面分别由易到难解释下:
(1)-contactPickerDidCancel:
很显然这个是点击右上角的cancel时候触发的,而不是picker的所有dismiss动作中都会触发。在多选模式下,cancel在done的左侧。
其他四个代理方法只要实现其中任一一个就行了。分别为单选和多选两组,都实现的时候,多选优先执行,单选不执行。特别要注意的是predicateForEnablingContact,predicateForSelectionOfContact,predicateForSelectionOfProperty这三组会影响它们的动作。predicateForEnablingContact返回YES的联系人才是可交互的,不设置的时候都是可交互的。
(2)- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(nonnull CNContact *)contact
只实现该方法时,如果predicateForSelectionOfContact没设置或者命中,则将会在点击联系人列表或该联系人时触发。如果不命中则会触发默认动作,也即是进入联系人详细页。
(3)- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContacts:(NSArray<CNContact *> *)contacts
只实现该方法时,联系人列表进入多选模式,该方法在点击done按钮时触发。然而并不受predicateForSelectionOfContact影响。
(4)- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty
只实现该方法时,可以进入到联系人详情页面,如果predicateForSelectionOfProperty没设置或者命中,则将会在点击联系人某个property时触发并返回该contactProperty。如果不命中则会触发默认动作,也即是打电话,发邮件,Facebook等。
(5)- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperties:(NSArray<CNContactProperty *> *)contactProperties
只实现该方法时,停留在多选模式下的联系人列表页面,如果predicateForSelectionOfProperty没设置或者命中,则该联系人能被选中,在点击done按钮的时候触发,返回的contactProperties中只包含命中的contactProperties。没设置的话返回空。例如:
picker.predicateForSelectionOfProperty = [NSPredicate predicateWithFormat:@"(key == 'emailAddresses') AND (value LIKE '*@mac.com')"];
则会返回:
2015-11-04 09:44:35.171 CNContactDemo[864:23197] (
"<CNContactProperty: 0x7bf58880: contact identifier=2B85C255-DD63-4C14-BB77-15DF2E51952D, contact name=John Appleseed, key=emailAddresses, identifier=CEB1A114-10B1-4D52-AABD-D71FD18C4441, value=John-Appleseed@mac.com>",
"<CNContactProperty: 0x7bed3670: contact identifier=F5E24C63-0D24-4FFD-A56C-C93CB963CDAC, contact name=Kate Bell, key=emailAddresses, identifier=B0F96AAF-B02C-4211-90B1-088CFFA1647E, value=kate-bell@mac.com>",
"<CNContactProperty: 0x7bed5ce0: contact identifier=2DA07C7C-D7AD-4C52-B28A-8303F5174259, contact name=Anna Haro, key=emailAddresses, identifier=6EEF91C2-8B5A-41F8-9C71-8FBDB6E73FC5, value=anna-haro@mac.com>",
"<CNContactProperty: 0x7bed65b0: contact identifier=DC552425-6351-4E05-84E9-268BEC81048F, contact name=Daniel Higgins Jr., key=emailAddresses, identifier=DB984B17-579A-4767-B80D-8ACE280C414F, value=d-higgins@mac.com>",
"<CNContactProperty: 0x7bed6e90: contact identifier=FF3C915A-BF45-4EF8-9AC1-95B835116EE8, contact name=Hank M. Zakroff, key=emailAddresses, identifier=C87EE97E-D58A-4415-BB6B-7195E191D990, value=hank-zakroff@mac.com>"
)
如果没命中,则该联系人无法选中。
如果(4)和(5)均没有实现,则predicateForSelectionOfProperty会被忽略。而如果(2)、(3)、(5)均没有实现的时候,predicateForSelectionOfContact会被忽略。这里有点奇怪,就是(5)也会参杂进来,然而(5)和predicateForSelectionOfContact并没有什么影响,可能是一个bug。