深入理解iOS API系列(四)理解CNContactPickerDelegate

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。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值