Как реализовать функцию сортировки так же, как AddressBook? - PullRequest
0 голосов
/ 20 сентября 2011

В моем приложении у меня есть список контактов, которые отображаются в порядке возрастания. Когда пользователь нажимает на любой алфавит, скажем «b», список должен прокручиваться к контакту, начиная с «b». Это встроенная функцияАдресная книга? Может кто-нибудь знает, как мне этого добиться?

Заранее спасибо!

1 Ответ

1 голос
/ 20 сентября 2011

Мой довольно грязный метод. Сортировка по электронной почте, имени и фамилии без указания второго имени, потому что мне это не нужно. Да, и он находит только те контакты, которые имеют адрес электронной почты. Этого можно избежать, если немного отредактировать код, начинающийся с 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

Doh! Я был недостаточно бдителен, чтобы внимательно прочитать все это. :) Попробуйте создать NSMutableDictionary и каждый раз, когда вызывается метод headerForSection: сохраните его в словаре с соответствующей буквой в качестве ключа. Затем, когда пользователь выбирает букву «B», отправьте свой UITableView setContentOffset: animated: метод с соответствующим смещением, взятым из этого словаря.

...