2017-09-22 125 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上看到了一些聯繫人選擇框架。我不確定質量如何,但至少可以提供一個很好的起點。

相關問題