在tableview中对对象数组进行排序

时间:2011-08-31 10:19:26

标签: objective-c ipad uitableview sorting custom-cell

我正在开发一个iPad应用程序,它有一个自定义单元格的桌面视图。 每个单元格都是一个对象,它表示3列中类的属性。 我想根据列对数据进行排序。如何使用目标c实现它?

3 个答案:

答案 0 :(得分:2)

您可以使用NSSortDescriptor完成此任务。

准备需要排序的数组

NSArray *objects = [[NSArray alloc] initWithObjects:obj1, obj2, obj3, nil];

使用NSSortDescriptors创建一个数组,在本例中我使用1.对于DescriptorKey,从Cell中获取您希望排序的属性。

NSArray *descriptor = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]];

然后实例化一个新数组并从初始数组上的NSArray调用sortedArrayUsingDescriptors实例方法,返回一个具有相同对象的已排序数组。

NSArray *sortedArray = [objects sortedArrayUsingDescriptors:descriptor];

希望这有帮助!

答案 1 :(得分:1)

据我了解,UITableView中没有“列”。人们将格式良好的子视图放在TableViewCell中,使表格看起来像列。

对于Array的排序,您可以尝试上面的Bryan方法。获得排序的数组调用后

  [TheTableView reloadData];

答案 2 :(得分:0)

我有多个NSMutableArrays和许多自定义单元格的类似情况。我不得不根据不同的列对它们进行排序,我搜遍了所有,无法找到解决方案。 所以这是我的:

从列上的UIButton,我发送两个参数(sortwith和ascending / descending),并将每个“ROW”的所有内容保存到字典中。

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

我重新初始化现有的Mutable数组,使它们为零。

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;
    }
}