是否可以自定义CNContactPickerViewController?

时间:2017-09-22 20:21:13

标签: objective-c xcode uiviewcontroller uiview-hierarchy

我打开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];

当它打开时,它目前看起来像这样:

Before Customisation

但是由于SDK中存在错误,因此无法从搜索结果中进行选择,因此搜索此类视图中的人员并不起作用。我要为此提交一个错误,但同时我首先要隐藏搜索栏。我发现了一些关于删除SearchBar的旧问题,但它们与ABPeoplePickerNavigationController有关,与CNContacts无关。 我也不想使用群组,如果我可以删除该按钮并将取消按钮移到左侧那将是很棒的,并且会使我的应用程序中的选择界面看起来更清晰。这就是我希望它的样子:

After Customisation

有人能告诉我这是否可行并且可能指出我正确的方向?我有委托方法在选择后接收contacts数组,我的问题是它在应用程序中的样子。

提前致谢!

血浆

2 个答案:

答案 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;}
相关问题