2011-09-20 69 views
0

在我的應用程序中,我列出了按升序顯示的聯繫人。當用戶單擊任何字母表時,都會顯示'b',那麼列表應該滾動到從'b'開始的聯繫人。這是AddressBook的內置功能?有誰知道我可以如何實現這一目標?如何實現與AddressBook相同的排序功能?

在此先感謝!

+1

這不是一種排序功能...... – Saphrosit

+0

據我所知,沒有越獄的方法。但是 - 看起來實際上並不是很難實現自己,這絕對是可行的。 –

回答

1

我很骯髒的方法。它通過電子郵件排序,名字和姓氏省略中間名,因爲我不需要那個。哦,它只找到那些有電子郵件地址的聯繫人。你能避免,如果你稍微修改代碼開頭if (ABMultiValueGetCount(emailRef))

您的視圖控制器:

- (NSArray *)sortedContactsFromPeople:(CFArrayRef)people { 
    NSMutableArray *contacts = [NSMutableArray array]; 

    for (int i = 0; i < CFArrayGetCount(people); i++) { 
    ABRecordRef record = CFArrayGetValueAtIndex(people, i); 
    ABMultiValueRef emailRef = ABRecordCopyValue(record, kABPersonEmailProperty); 
    CFStringRef email; 

    if (ABMultiValueGetCount(emailRef)) { 

     BOOL hasValidEmail = NO; 

     for (int j = 0; j < ABMultiValueGetCount(emailRef); j++) { 
     if (!hasValidEmail) { 
      email = ABMultiValueCopyValueAtIndex(emailRef, j); 
      if ([Validator validateEmail:(NSString *)email] == kValNoErr) 
      hasValidEmail = YES; 
      else 
      CFRelease(email); 
     } 
     } 

     if (hasValidEmail) { 
     CFStringRef name = ABRecordCopyValue(record, kABPersonFirstNameProperty);   
     CFStringRef lastname = ABRecordCopyValue(record, kABPersonLastNameProperty); 

     NSData *contactImageData = (NSData*)ABPersonCopyImageData(record); 
     UIImage *img = [[[UIImage alloc] initWithData:contactImageData] autorelease]; 
     [contactImageData release]; 

     if (lastname == nil) 
      lastname = (CFStringRef)@""; 

     if (name == nil) 
      name = (CFStringRef)@""; 

     Contact *contact = [[[Contact alloc] initWithName:(NSString *)name 
               lastname:(NSString *)lastname 
                email:(NSString *)email 
               profileIcon:img] autorelease]; 

     if (![(NSString *)lastname isEqualToString:@""]) 
      contact.sortChar = [(NSString *)lastname substringToIndex:1]; 
     else if (![(NSString *)name isEqualToString:@""]) 
      contact.sortChar = [(NSString *)name substringToIndex:1]; 
     else if (![(NSString *)email isEqualToString:@""]) 
      contact.sortChar = [(NSString *)email substringToIndex:1];     

     contact.idNumber = ABRecordGetRecordID(record); 

     [contacts addObject:contact]; 

     if (lastname) 
      CFRelease(lastname); 
     if (name) 
      CFRelease(name); 
     CFRelease(email); 
     } 
    } 
    CFRelease(emailRef); 
    } 

    NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"sortChar" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
    [contacts sortUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 
    return contacts; 
} 

- (void)initBaseValues { 
    sections = [[NSMutableDictionary alloc] init]; 

    ABAddressBookRef addressBook = ABAddressBookCreate(); 

    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); 

    NSInteger section = 0; 
    NSString *prevChar = nil; 

    NSArray *contacts = [self sortedContactsFromPeople:people]; 

    for (int i = 0; i < contacts.count; i++) { 

    Contact *contact = [contacts objectAtIndex:i]; 

    BOOL sectionExists = NO; 

    if ([prevChar isEqualToString:contact.sortChar]) 
     sectionExists = YES; 

    if (!sectionExists) { 
     [sections setObject:[NSMutableArray array] forKey:[NSString stringWithFormat:@"%d", section]]; 
     section++; 
    } 

    [prevChar autorelease]; 
    prevChar = [contact.sortChar copy]; 

    [[sections objectForKey:[NSString stringWithFormat:@"%d", section-1]] addObject:contact]; 
    } 

    if (prevChar != nil) 
    [prevChar release]; 

    CFRelease(people); 
    CFRelease(addressBook); 
} 

Contact.h

@interface Contact : NSObject { 
    NSString *name; 
    NSString *lastname; 
    NSString *email; 
    UIImage *profileIcon; 
    NSInteger idNumber; 
} 

@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSString *lastname; 
@property (nonatomic, copy) NSString *email; 
@property (nonatomic, retain) UIImage *profileIcon; 
@property (nonatomic) NSInteger idNumber; 
@property (nonatomic, copy) NSString *sortChar; 

- (id)initWithName:(NSString *)name_ 
      lastname:(NSString *)lastname_ 
      email:(NSString *)email_ 
     profileIcon:(UIImage *)profileIcon_; 

@end 

衛生署!我沒有足夠的警惕,仔細閱讀整件事情。 :)嘗試創建NSMutableDictionary,並且每次調用headerForSection:方法時,都會將它的偏移量存儲在字典中,並使用適當的字母作爲鍵。然後,當用戶選擇「B」字母發送你的UITableView setContentOffset:animated:方法與從該字典取得適當的偏移量。

+0

嘿謝謝你的回覆,但來自聯繫人我的意思是客戶名單。我有一個數組,其中包含客戶名稱,我使用簡單的UITableView顯示。 –

+0

那麼上面的代碼仍然可以排序你可能需要的任何類型的聯繫人。看到你可以刪除所有使用ABAddressBook的代碼並實現相同的目標。對於表視圖,返回'numberOfSectionsInTableView:'中的「sections」字典計數並返回'[sections objectForKey:[NSString stringWithFormat:@「%d」,indexPath.row]];'在'numberOfRowsInSection:'中。 – Eugene

相關問題