是否可以自定义CNContactPickerViewController?

Pla*_*sma 7 xcode objective-c 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];
Run Code Online (Sandbox Code Playgroud)

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

在定制之前

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

定制后

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

提前致谢!

等离子体

小智 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;}
Run Code Online (Sandbox Code Playgroud)