我打开CNContactPickerViewController以便在应用程序中使用,但我想改变它呈现的方式以满足我的应用程序需求,最好不要自己动手并做很多重新发明的轮子。这就是我使用Objective-C ....打开它的方法。
self.contactPicker = [[CNContactPickerViewController alloc] init];
self.contactPicker.delegate = self;
//Only enable contacts to be selected that have atleast one email address
NSArray *propertyKeys = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey];
NSPredicate *enablePredicate = [NSPredicate predicateWithFormat:@"emailAddresses.@count != 0"];
self.contactPicker.displayedPropertyKeys = propertyKeys;
self.contactPicker.predicateForEnablingContact = enablePredicate;
[self presentViewController:self.contactPicker animated:YES completion:nil];
当它打开时,它目前看起来像这样:
但是由于SDK中存在错误,因此无法从搜索结果中进行选择,因此搜索此类视图中的人员并不起作用。我要为此提交一个错误,但同时我首先要隐藏搜索栏。我发现了一些关于删除SearchBar的旧问题,但它们与ABPeoplePickerNavigationController有关,与CNContacts无关。 我也不想使用群组,如果我可以删除该按钮并将取消按钮移到左侧那将是很棒的,并且会使我的应用程序中的选择界面看起来更清晰。这就是我希望它的样子:
有人能告诉我这是否可行并且可能指出我正确的方向?我有委托方法在选择后接收contacts数组,我的问题是它在应用程序中的样子。
提前致谢!
血浆
答案 0 :(得分:1)
真正的答案是你不想听到的答案:
不,您无法修改Apple提供的UI(至少以有意义的方式)。您可能可以修改色调颜色和其他次要细节,但不能更改您喜欢的任何内容。如果搜索选择器中存在错误,那么您肯定无法解决这个问题。我建议只是隐藏搜索栏不是一个很好的选择,因为对于大型联系人列表,搜索通常是用户导航到联系人的主要方式。
附注 - 许多Apple的框架视图控制器已实现 作为一种特殊的“远程视图控制器”。视图控制器 实际上并不是作为应用程序的一部分运行,而是在沙盒中运行 家长申请。这可以防止任何类型的欺骗,如遍历 并修改这些呈现的控制器的UI层次结构。一世 如果是这种情况就不会感到惊讶。
我建议重新创建联系人选择视图并不是太难,并且在自定义方面为您提供了全面的灵活性。我自己完成了,并没有任何重大障碍要跨越。即使你是iOS新手,也是一个很好的学习练习。对于一个好的解决方案,您可能希望获取后台线程上的所有联系人并显示加载微调器,因为大型联系人数据库可能需要一段时间才能获取。 (更好的是,预取前一个视图上的联系人,如果该提取尚未完成,则仅显示加载微调器。)
如果您不喜欢这样做,我在GitHub上看到了一些联系人选择框架。我不确定质量是什么样的,但至少,这些可能是一个很好的起点。
答案 1 :(得分:0)
您可以获取所有联系人的数组,然后根据需要显示和使用它们:
- (NSMutableArray<CNContact *> *)allContacts {
NSMutableArray <CNContact *> *result = [NSMutableArray array];
NSError *error = nil;
NSArray *keysToFetch = @[CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataKey,
[CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]];
CNContactStore *contactStore = [[CNContactStore alloc] init];
NSArray <CNContainer *> *allContainers = [contactStore containersMatchingPredicate:nil error:&error];
for (CNContainer *container in allContainers) {
NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:container.identifier];
NSArray *fetchedContacts = [contactStore unifiedContactsMatchingPredicate:predicate keysToFetch:keysToFetch error:&error];
[result addObjectsFromArray:fetchedContacts];
}
return result;}