• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 如何使用带有 CNContactPickerViewController 的一组电话号码过滤联系人?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:44:45 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我尝试使用一组现有电话号码从通讯录中过滤一些联系人。 CNContactPickerViewController 当这些联系人的电话号码与现有电话号码相匹配时,应禁止选择这些联系人。

我需要使用电话号码作为过滤器,因为这些电话号码可能来自其他应用平台。并且该服务不应允许用户使用已存在的相同电话号码的联系人。我不想为这个快速操作创建自己的联系人选择器。

这是我迄今为止尝试过的。

NSArray<CNPhoneNumber *> *existingPhoneNumbers = @[@"1111", @"2222"];

CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];
contactPicker.delegate = self;
contactPicker.displayedPropertyKeys = @[CNContactNamePrefixKey,
                                        CNContactGivenNameKey,
                                        CNContactFamilyNameKey,
                                        CNContactOrganizationNameKey,
                                        CNContactPhoneNumbersKey];

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat"NOT (ANY phoneNumbers.value.stringValue IN %@)", existingPhoneNumbers];

contactPicker.predicateForEnablingContact = predicates;

错误信息:

[CNUI ERROR] Error when showing picker: Error Domain=CNErrorDomain Code=300 "(null)" UserInfo={CNValidationErrors=(
"Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo={CNKeyPaths=(\n    \"phoneNumbers.value.stringValue\"\n), NSLocalizedDescription=Invalid Predicate, NSLocalizedFailureReason=The operation couldn't be completed because its predicate is invalid.}")}

使用 SUBQUERY 仍然无法正常工作。

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat"SUBQUERY(phoneNumbers, $CNLabeledValue,$CNLabeledValue.value.stringValue IN %@).@count == 0"];

错误信息:

[CNUI ERROR] Error when showing picker: Error Domain=CNErrorDomain Code=300 "(null)" UserInfo={CNValidationErrors=(
"Error Domain=CNErrorDomain Code=400 \"Invalid Predicate\" UserInfo={CNKeyPaths=(\n    \"value.stringValue\"\n), NSLocalizedDescription=Invalid Predicate, NSLocalizedFailureReason=The operation couldn't be completed because its predicate is invalid.}")}

还尝试了 predicateWithBlock:。它根本不支持基于 block 的谓词。

来自 WWDC 2015 Introducing the Contacts Framework for iOS and OS X session . 他们说 predicateForEnablingContact 在“CNContact”上进行评估。该文档没有说谓词必须像 CNContactFetchRequest 那样来自 CNContact+Predicates



Best Answer-推荐答案


已经找到问题了。当我遇到这个问题时,我的头发几乎掉光了。解决方案是在 value 中添加撇号。像这样

let predicate = NSPredicate(format: "ANY self.phoneNumbers.'value'.'digits' BEGINSWITH %@", "+420" 

希望对你有帮助。

关于ios - 如何使用带有 CNContactPickerViewController 的一组电话号码过滤联系人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37481483/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap