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)]];