2012-09-22 29 views
6

我希望我的用戶通過從地址簿中選擇聯繫人的電子郵件來填寫電子郵件字段。我不希望他們滾動所有未設置電子郵件的聯繫人,所以我想過濾那些有電子郵件地址的聯繫人。如何告訴ABPeoplePickerNavigationController僅列出具有電子郵件地址的聯繫人?

這是我迄今爲止編寫的代碼。我可以找出誰有一個電子郵件地址,誰沒有,但我不能告訴ABPeoplePickerNavigationController只列出正確的聯繫人。這是不可能的,我的意思是我必須通過使用表視圖來實現我自己的聯繫人選擇器類,或者這段代碼有什麼問題嗎?

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *peopleList = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 
NSLog(@"%ld people exist in the addressBook", ABAddressBookGetPersonCount(addressBook)); 
for (id peopleRecord in peopleList) { 
    ABMultiValueRef mv = ABRecordCopyValue((ABRecordRef)peopleRecord, kABPersonEmailProperty); 
    CFIndex numberOfAddresses = ABMultiValueGetCount(mv); 
    if(numberOfAddresses == 0) { 
     CFErrorRef err; 
     ABAddressBookRemoveRecord(addressBook, (ABRecordRef)peopleRecord, &err); 
    } 
} 
[peopleList release]; 

NSLog(@"%ld people have an email", ABAddressBookGetPersonCount(addressBook)); 

ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; 
NSNumber* emailProp = [NSNumber numberWithInt:kABPersonEmailProperty]; 
[peoplePicker setAddressBook:addressBook]; 
peoplePicker.displayedProperties = [NSArray arrayWithObject:emailProp]; 
[peoplePicker setPeoplePickerDelegate:self]; 
[self presentModalViewController:peoplePicker animated:YES]; 

回答

1

我不認爲有辦法讓iOS來做這個過濾。我也是用代碼來做的。請注意,您需要查找各種電子郵件地址 - 您必須遍歷可以獲得的字典。與此一起工作是一個PITA肯定 - 我以前做過 - 而且你必須小心,不要有內存泄漏。

我所做的是按照你的建議 - 遍歷所有聯繫人自己,然後用表格彈出一個視圖,然後選擇他們想要的人的名字。我保持一個關聯,所以我知道什麼地址與什麼名字相關聯,然後使用系統電子郵件框架,然後填充發送地址。

+0

好的,謝謝你的建議! – aslisabanci

15

我知道這是舊的,但是我在研究相關主題時偶然發現了這個,所以我想我會用我的發現來更新它。

  1. 雖然它並不過濾結果,這是值得注意的是,iOS的8對禁用觸點的功能,沒有電子郵件地址:

    peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
    

    你仍然可以看到所有的聯繫人,但至少那些沒有電子郵件地址的人被禁用。顯然,如果你的最低目標OS早的iOS 8,你會做上述條件:

    if ([peoplePickerController respondsToSelector:@selector(predicateForEnablingPerson)]) { 
        peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
    } 
    
  2. 如果要過濾掉那些條目沒有地址,你必須出示自己的UI(例如,創建你自己的tableview)。所以,第一,建立你自己的電子郵件地址的聯繫人的陣列,像這樣:

    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
        if (granted) { 
         NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 
         NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) { 
          ABMultiValueRef emails = ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonEmailProperty); 
          NSInteger count = ABMultiValueGetCount(emails); 
          CFRelease(emails); 
          return count > 0; 
         }]; 
    
         NSArray *peopleWithEmails = [allPeople filteredArrayUsingPredicate:predicate]; 
    
         // You now have an array of `ABRecordRef` associated with 
         // those contacts with email addresses. You can use this as 
         // the model backing your own table view, or populate your 
         // own model. 
        } else { 
         NSLog(@"Access not granted"); 
         if (error) { 
          CFRelease(error); 
         } 
        } 
    }); 
    

    做完,那麼你可以建立自己的tableview從peopleWithEmails上市的相關細節。

+0

請注意,點2下的代碼適用於iOS 6及更高版本。如果您需要支持較早的iOS版本,則不會使用「ABAddressBookRequestAccessWithCompletion」檢查權限。 – Rob

相關問題