2017-09-22 1 views
7

응용 프로그램에서 사용하기 위해 CNContactPickerViewController를 여는 중입니다.하지만 내 응용 프로그램 요구 사항에 맞게 선물하는 방식을 변경하고 싶습니다. 선호하는 방식을 바꾸고 휠을 다시 발명하지 않고 가능하면 좋습니다. 그것이 현재 다음과 같습니다 열리면이 .... 내가 목표 - 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의 여러 가지 버그로 인해 사용이 불가능한 상태로 남아있는 것처럼 보입니다. Apple의 아무도이 컨트롤러를 사용할 수 없도록 만드는 쓸모없는 검색 창을 제거하지 않아도이 문제를 해결할 수있을 정도로 신경을 많이 쓰지 않는다고 생각합니다. – SAHM

+0

나는 어디에도 가지 않았다. 비슷한 일을하는 github 프로젝트를 보았지만 그 중 어떤 것도 좋아하지 않았다. 나는 내 자신을 굴릴 시간을 가질 때까지 잠시 동안 프로젝트를 보류했다. – Plasma

1

진짜 대답은 당신이 듣고 싶지 않아 하나입니다 :

아니요, Apple이 제공하는 UI는 수정할 수 없습니다 (적어도 의미있는 방법으로). 색조 색상 및 기타 사소한 세부 사항을 수정할 수는 있지만 원하는대로 변경할 수는 없습니다. 검색 선택기에 버그가있는 경우, 불행히도이를 해결할 수 없습니다. 검색 창을 숨기는 것만으로는 큰 옵션이 아니라는 점을 제안합니다. 대용량 연락처 목록의 경우 사용자가 연락처로 이동할 수있는 주요 방법이기 때문입니다.

사이드 노트 - 많은 Apple의 프레임 워크보기 컨트롤러는 특별한 종류의 '원격보기 컨트롤러'로 구현되었습니다. 보기 컨트롤러 은 실제로 앱의 일부로 실행되지 않고 상위 애플리케이션의 샌드 박스에서 실행됩니다. 이렇게하면 을 트래버스하고 제시된 컨트롤러의 UI 계층을 수정하는 것과 같은 일종의 속임수가 발생하지 않습니다. 내가 여기에 해당하는 경우 나는 놀라지 않을 것입니다.

연락처 선택보기를 다시 만드는 것이 너무 어렵지 않으며 사용자 지정 측면에서 완벽한 유연성을 제공합니다. 나는 그것을 직접 해왔고, 교차 할 큰 장애물은 없었다. iOS에 익숙하지 않더라도 훌륭한 학습 활동이 될 것입니다. 좋은 해결책을 위해 백그라운드 스레드의 모든 연락처를 가져 와서 로딩 스피너를 표시하고 싶을 것입니다. 대규모 연락처 데이터베이스를 가져 오는 데 약간의 시간이 걸릴 수 있기 때문입니다. (이전보기에서 연락처를 프리 페치하고 불러 오기가 끝나지 않은 경우에만로드 스피어너를 표시하십시오.)

GitHub에서 그와 관련된 몇 가지 연락처 선택 프레임 워크를 보았습니다. 나는 품질이 어떤 것인지 잘 모르겠다. 그러나 적어도 이것들은 훌륭한 출발점을 제공 할 것이다.

관련 문제