2017-09-22 80 views
7

我正在打开一个CNContactPickerViewController以供在应用程序中使用,但我想要改变它呈现的方式以适合我的应用程序需求,最好不要滚动我自己并做大量重新发明的轮子。这就是我如何使用Objective-C打开它....是否可以自定义CNContactPickerViewController?

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:@"[email protected] != 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

谁能告诉我,如果这是可能的,也许指向我朝着正确的方向?我有委托方法选择后接收联系人数组,我的问题是它在应用程序中的样子。

在此先感谢!

等离子

回答

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;} 
+1

感谢您的答复,但正如我在文章中提到的,我没有问题检索和管理联系人/返回的结果。问题在于默认Apple ContactPicker GUI的外观以及“搜索”不起作用的事实。我没有看到通过编码我自己的视图控制器来重新发明轮子的意义,如果只需稍作调整,标准控制器也可以发挥作用。 – Plasma

+0

@plasma你发现了什么,或者你最终做了什么?这个问题让我感到无法接受。看起来好像CNContactPickerViewController被苹果公司的几个iOS之前的版本所遗留下来,它是无法使用的,错误缠身的状态。我发现很难相信苹果没有人能够通过至少删除无用的搜索栏来解决这个问题,因为这个搜索栏使得这个控制器无法使用。 – SAHM

+0

我没有得到任何地方,我看了几个做类似事情的github项目,但不喜欢其中的任何一个。我暂时搁置了这个项目,直到我有时间推出自己的产品并从那里出发。 – Plasma

1

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

不,您无法修改Apple提供的UI(至少以有意义的方式)。您可能可以修改色调和其他小细节,但无法改变您喜欢的任何内容。如果在搜索选择器中存在错误,那么不幸的是你肯定无法解决这个问题。我建议隐藏搜索栏并不是一个好的选择,因为对于大型联系人列表,搜索通常是用户导航到联系人的主要方式。

备注 - 许多苹果的框架视图控制器被实现为 作为一种特殊的'远程视图控制器'。视图控制器 实际上并未作为应用程序的一部分运行,而是在 父应用程序的沙箱中运行。这可以防止任何类型的欺骗,比如遍历 并修改这些呈现的控制器的UI层次结构。如果在这里,我不会感到惊讶。

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

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

相关问题