7

我正在打开一个 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 无关。我也不希望使用组,如果我可以删除该按钮并将取消按钮移到左侧,那就太好了,并且会使我的应用程序中的选择界面看起来更清晰。这就是我希望它看起来的样子:

定制后

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

提前致谢!

等离子体

4

2 回答 2

2

真正的答案是你不想听到的:

不,您不能修改 Apple 呈现的 UI(至少以有意义的方式)。您也许可以修改色调颜色和其他小细节,但您无法更改任何您喜欢的内容。如果搜索选择器中存在错误,那么很遗憾,您当然无法修复它。我建议仅隐藏搜索栏不是一个好选择,因为对于大型联系人列表,搜索通常是用户导航到联系人的主要方式。

旁注 - 许多 Apple 的框架视图控制器都是作为一种特殊的“远程视图控制器”实现的。视图控制器实际上并不作为应用程序的一部分运行,而是在父应用程序的沙箱中运行。这可以防止任何类型的诡计,例如遍历和修改这些呈现的控制器的 UI 层次结构。如果这里是这种情况,我不会感到惊讶。

我建议重新创建联系人选择视图并不太难,并且在自定义方面为您提供了完全的灵活性。我自己做过,没有任何重大障碍需要跨越。即使您是 iOS 新手,这也是一个很好的学习练习。对于一个好的解决方案,您可能希望在后台线程上获取所有联系人并显示加载微调器,因为大型联系人数据库可能需要一些时间来获取。(更好的是,在前一个视图中预取联系人,并且仅在该取指尚未完成时才显示加载微调器)。

如果您不想这样做,我已经在 GitHub 上看到了一些联系人选择框架。我不确定质量如何,但至少,这些可能会提供一个很好的起点。

于 2017-10-08T21:02:34.600 回答
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;}
于 2017-10-04T06:44:04.233 回答