У меня была похожая ситуация с несколькими NSMutableArrays и множеством пользовательских ячеек. Я должен был отсортировать их по различным столбцам, и я искал по всему и не мог найти решение.
Так вот мое:
Из UIB-кнопки на столбце я отправляю два параметра (сортировка по возрастанию и убыванию) и сохраняю все содержимое каждой строки в словаре.
-(void)sortTheArray :(NSString *)sortWith :(BOOL)isAsc
{
sortedArray = [[NSMutableArray alloc]init];
NSDictionary *dict;
for (int i =0; i< orderArr.count; i++) {
dict = [NSDictionary dictionaryWithObjectsAndKeys:[addressArr objectAtIndex:i], @"names", [zipArr objectAtIndex:i], @"zip", [orderArr objectAtIndex:i], @"orderNo", [cityArr objectAtIndex:i], @"city", nil];
[sortedArray addObject:dict];
// NSLog(@"Sorted Array: %@", [sortedArray objectAtIndex:i]);
}
Теперь, основываясь на том, какой столбец был выбран, я использую дескриптор сортировки для сортировки только что созданного словаря.
NSSortDescriptor *sortDescript = [[NSSortDescriptor alloc]initWithKey:sortWith ascending:isAsc];
NSArray *descriptors = [NSArray arrayWithObject:sortDescript];
NSArray *newSortedArray = [sortedArray sortedArrayUsingDescriptors:descriptors];
Я реинициализирую существующие изменяемые массивы, чтобы они равнялись нулю.
orderArr = [[NSMutableArray alloc]init];
zipArr = [[NSMutableArray alloc]init];
addressArr = [[NSMutableArray alloc]init];
cityArr = [[NSMutableArray alloc]init];
Здесь я начинаю добавлять содержимое отсортированного массива обратно к старым NSMutableArrays и перезагружаю таблицу.
for (int i = 0; i<newSortedArray.count; i++) {
// NSLog(@"New Sorted Array is : %@", [newSortedArray objectAtIndex:i]);
orderArr = [newSortedArray valueForKey:@"orderNo"];
zipArr = [newSortedArray valueForKey:@"zip"];
addressArr = [newSortedArray valueForKey:@"names"];
cityArr = [newSortedArray valueForKey:@"city"];
}
[self.tableObject reloadData];
}
Если вам это нужно, мой UIButton выглядит так:
- (IBAction)sortWithOrderNo:(id)sender;
{
if (isAscending == YES) {
[self sortTheArray:@"orderNo":YES];
isAscending = NO;
}
else
{
[self sortTheArray:@"orderNo":NO];
isAscending = YES;
}
}