2017-09-22 17 views
7

Tôi đang mở một CNContactPickerViewController để sử dụng trong một ứng dụng, nhưng tôi muốn thay đổi cách nó trình bày cho phù hợp với nhu cầu ứng dụng của tôi, tốt nhất là không lăn của riêng tôi và làm rất nhiều phát minh lại bánh xe. Đây là cách tôi mở nó bằng Objective-C ....Có thể tùy chỉnh CNContactPickerViewController không?

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]; 

Khi nó mở nó hiện trông như thế này:

Before Customisation

Tuy nhiên do một lỗi trong SDK tìm kiếm cho những người thuộc loại chế độ xem này không hoạt động, vì bạn không thể chọn từ kết quả tìm kiếm. Tôi sẽ gửi một lỗi cho điều này nhưng trong thời gian có nghĩa là trước hết tôi muốn ẩn thanh tìm kiếm. Tôi tìm thấy một số câu hỏi cũ về loại bỏ SearchBar nhưng chúng liên quan đến ABPeoplePickerNavigationController và không liên quan đến CNContacts. Tôi cũng không muốn sử dụng Groups và nếu tôi có thể xóa nút đó và di chuyển nút Hủy sang bên trái sẽ tuyệt vời và sẽ làm cho giao diện lựa chọn trong ứng dụng của tôi trông sạch hơn nhiều. Đây là cách tôi muốn nó nhìn:

After Customisation

bất cứ ai có thể cho tôi biết nếu điều này là có thể và có thể chỉ cho tôi đi đúng hướng? Tôi có phương thức ủy nhiệm để nhận mảng danh bạ sau khi lựa chọn, vấn đề của tôi là cách nó trông trong ứng dụng.

Cảm ơn trước!

Plasma

Trả lời

0

Bạn có thể nhận được một mảng của tất cả các địa chỉ liên lạc, và sau đó hiển thị và làm việc với nó như bạn muốn:

- (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

Cảm ơn bạn đã trả lời nhưng như đã đề cập trong bài đăng của tôi, tôi không gặp vấn đề khi truy xuất và quản lý danh bạ/kết quả trả về. Vấn đề là với giao diện mặc định của Apple ContactPicker GUI và thực tế là "tìm kiếm" không hoạt động. Tôi không thấy điểm trong việc tái phát minh ra bánh xe bằng cách mã hóa bộ điều khiển xem của riêng tôi nếu với một vài chỉnh sửa, cái chuẩn cũng sẽ hoạt động tốt. – Plasma

+0

@plasma bạn đã tìm ra điều gì hoặc bạn đã làm gì? Vấn đề này khiến tôi không có kết thúc. Nó có vẻ như CNContactPickerViewController đã bị bỏ lại phía sau bởi Apple một số iOS của nó trước đây nó không thể sử dụng, lỗi-ridden nhà nước. Tôi thấy thật khó tin rằng không ai từ Apple đã từng chăm sóc đủ để sửa lỗi này bằng cách loại bỏ thanh tìm kiếm vô dụng làm cho bộ điều khiển này không sử dụng được. – SAHM

+0

Tôi đã không nhận được bất cứ nơi nào, tôi nhìn vào một số dự án github làm những việc tương tự, nhưng không giống như bất kỳ của họ. Tôi đã tạm dừng dự án cho đến lúc tôi có thời gian để cuộn mình và đi từ đó. – Plasma

1

Câu trả lời thực sự là một trong những bạn không muốn nghe:

Không, bạn không thể sửa đổi giao diện người dùng mà Apple giới thiệu (ít nhất là theo cách có ý nghĩa). Bạn có thể sửa đổi màu sắc và các chi tiết nhỏ khác, nhưng bạn không thể thay đổi bất cứ điều gì bạn thích. Nếu có lỗi trong bộ chọn tìm kiếm, bạn chắc chắn không thể sửa lỗi đó. Tôi cho rằng chỉ cần ẩn thanh tìm kiếm không phải là một lựa chọn tuyệt vời, vì đối với các danh sách liên hệ lớn, tìm kiếm thường là cách chính mà người dùng sẽ điều hướng đến các liên hệ.

Ghi chú bên cạnh - rất nhiều bộ điều khiển khung công tác của Apple được triển khai như một loại điều khiển từ xa đặc biệt. Trình điều khiển chế độ xem không thực sự chạy như một phần của ứng dụng của bạn, nhưng trong hộp cát của ứng dụng cha mẹ . Điều này ngăn cản bất kỳ loại thủ thuật nào như di chuyển ngang qua và sửa đổi thứ bậc giao diện người dùng của các trình điều khiển được trình bày này. Tôi sẽ không ngạc nhiên nếu đó là trường hợp ở đây.

Tôi khuyên bạn nên tạo lại chế độ xem lựa chọn liên hệ không quá khó và mang đến cho bạn sự linh hoạt hoàn toàn về mặt tùy chỉnh. Tôi đã tự làm nó, và không có bất kỳ trở ngại lớn nào để vượt qua. Ngay cả khi bạn mới sử dụng iOS, nó sẽ là một bài tập học tập tuyệt vời. Đối với một giải pháp tốt, bạn có thể muốn lấy tất cả các địa chỉ liên lạc trên một sợi nền và hiển thị một spinner tải, kể từ khi cơ sở dữ liệu liên hệ lớn có thể mất một chút thời gian để lấy. (Thậm chí tốt hơn, tìm nạp trước các địa chỉ liên hệ trên giao diện trước đó và chỉ hiển thị trình tải xuống nếu lần tìm nạp đó chưa hoàn tất).

Nếu bạn không thích làm điều đó, tôi đã thấy một vài khung lựa chọn liên hệ xung quanh địa điểm trên GitHub. Tôi không chắc chắn chất lượng là như thế nào, nhưng ít nhất, chúng có thể cung cấp một điểm khởi đầu tuyệt vời.

Các vấn đề liên quan