UILocalizedIndexedCollation UITableView Сортировка индексированного списка

Я создаю UITableView со списком контактов пользователей. Я успешно импортировал список контактов и храню их в массиве в виде словаря, содержащего имя, фамилию и идентификатор каждого контакта. Я пытаюсь реализовать UITableView's функция индексированного списка.

У меня возникают проблемы при попытке разделить массив на различные разделы в индексе таблицы UILocalizedIndexedCollation, Конкретно по селектору. Я хочу иметь возможность выбирать, сортировать ли имена по имени или фамилии.

- (void)getContacts
{
    // Do any additional setup after loading the view, typically from a nib.
    _addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    ABAddressBookRequestAccessWithCompletion(_addressBook, ^(bool granted, CFErrorRef error) {
        NSLog(@"GRANTED");
    });

    NSArray *rawContactData = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(_addressBook);
    NSMutableArray *newContactList = [[NSMutableArray alloc] init];

    for (int i = 0; i < [rawContactData count]; i++) {
        ABRecordRef contact = (__bridge ABRecordRef)rawContactData[i];

        NSDictionary *contactData = @{ @"name" : (__bridge_transfer NSString *)ABRecordCopyValue(contact, kABPersonFirstNameProperty),
                                       @"surname" : (__bridge_transfer NSString *)ABRecordCopyValue(contact, kABPersonLastNameProperty),
                                       @"recordID" :  [NSNumber numberWithInt:ABRecordGetRecordID(contact)]};
        [newContactList addObject:contactData];
    }


    _tableData = [NSMutableArray arrayWithArray:[self partitionObjects:newContactList collationStringSelector:@selector(name)]];
}



-(NSArray *)partitionObjects:(NSArray *)array collationStringSelector:(SEL)selector

{
    UILocalizedIndexedCollation *collation = [UILocalizedIndexedCollation currentCollation];

    NSInteger sectionCount = [[collation sectionTitles] count]; //section count is take from sectionTitles and not sectionIndexTitles
    NSMutableArray *unsortedSections = [NSMutableArray arrayWithCapacity:sectionCount];

    //create an array to hold the data for each section
    for(int i = 0; i < sectionCount; i++)
    {
        [unsortedSections addObject:[NSMutableArray array]];
    }

    //put each object into a section
    for (NSMutableDictionary *object in array) {
        NSInteger index = [collation sectionForObject:object collationStringSelector:selector];
        [[unsortedSections objectAtIndex:index] addObject:object];
    }


    NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount];

    //sort each section
    for (NSMutableArray *section in unsortedSections)
    {
        [sections addObject:[collation sortedArrayFromArray:section collationStringSelector:selector]];
    }

    return sections;
}

1 ответ

Селектор отправляется на объект, который вы сортируете в массиве. В вашем случае ваш объект имеет тип Dictionary, который не реализует селектор "имя" или фамилию и т. Д. Вы должны создать простой класс вместо использования словаря. и просто объявить свойства по своему вкусу

@interface Contact : NSObject 
@property (strong,nonatomic) NSString  *fname; 
@property (strong,nonatomic) NSString  *lname; 
@property (strong,nonatomic) NSNumber *rerordId; 
@end

Затем вы можете использовать этот объект вместо словаря, который вы используете.

Contact *contact= [[Contact alloc]init];
contact.fname = (__bridge_transfer NSString *)
               ABRecordCopyValue(contact, kABPersonFirstNameProperty);
contact.lname = (__bridge_transfer NSString *)
               ABRecordCopyValue(contact, kABPersonLastNameProperty);
contact.recrordId = [NSNumber numberWithInt:ABRecordGetRecordID(contact)].stringValue;
[newContactList addObject:contact];

Тогда вы можете использовать любое имя или селектор атрибута. Как и в вашем примере, вы напишите вызов функции сортировки с именем fname, например, так

_tableData = [NSMutableArray arrayWithArray:
             [self partitionObjects:newContactList
             collationStringSelector:@selector(fname)]];
Другие вопросы по тегам