使用 NSSortDescriptor 和 UISegmentedControl 的 UITableView 排序不起作用

UITableView sort with NSSortDescriptor and UISegmentedControl doesn’t work

我想使用分段控件对 tableview 进行排序,并按数据核心中的值对其进行排序。根据 Apple 文档,我的以下代码应该可以工作,但它什么也没做。

谁能告诉我我做错了什么?

- (void)viewDidLoad {
  [super viewDidLoad];

    UISegmentedControl *statFilter = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"A - Z", @"Stock", @"Price", nil]];
    [statFilter sizeToFit];
    [statFilter addTarget:self action:@selector(MySegmentControlAction:) forControlEvents: UIControlEventValueChanged];
    self.navigationItem.titleView = statFilter;

    self.artists = [[ArtistDataStore sharedStore] artists];
    [self.tableView reloadData];

    self.tableView.rowHeight = 60;

}


- (void)MySegmentControlAction:(UISegmentedControl *)segment
{
    NSArray *arrayToSort = [[ArtistDataStore sharedStore] artists];


    if(segment.selectedSegmentIndex == 0)
    {

        NSArray * result = [arrayToSort valueForKey:@"name"];

        NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES];
        result = [result sortedArrayUsingDescriptors:@[sd]];

    }
    if(segment.selectedSegmentIndex == 1)
    {
        NSArray * result = [arrayToSort valueForKey:@"stock"];

        NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES];
        result = [result sortedArrayUsingDescriptors:@[sd]];

    }
    if(segment.selectedSegmentIndex == 2)
    {
        NSArray * result = [arrayToSort valueForKey:@"price"];

        NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES];
        result = [result sortedArrayUsingDescriptors:@[sd]];

    }

    [self.tableView reloadData];
}

您是否尝试过使用要作为排序依据的 属性 创建 NSSortDescriptor?而不是零?

- (void)MySegmentControlAction:(UISegmentedControl *)segment
{
    NSArray *arrayToSort = [[ArtistDataStore sharedStore] artists];
    if(segment.selectedSegmentIndex == 0)
    {
        NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
        result = [arrayToSort sortedArrayUsingDescriptors:@[sd]];
    }

    [self.tableView reloadData];
}
NSArray *arrayToSort = [[ArtistDataStore sharedStore] artists];
NSString *key;
if (segment.selectedSegmentIndex == 0)
{
    key = @"name";
}
else if (segment.selectedSegmentIndex == 1)
{
    key = @"stock";
}
else if (segment.selectedSegmentIndex == 2)
{
    key = @"price";
}
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:YES];
self.artists = [arrayToSort sortedArrayUsingDescriptors:@[sortDescriptor]];

[self.tableView reloadData];

我假设当您在 tableView:cellForRowAtIndexPath: 中配置您的单元格时,您使用 self.artists 数组作为数据。因此,在 MySegmentControlAction: 中,您应该更新该数组,而不是从未实际使用过的 results 数组。您也没有使用键设置 sortDescriptor。我已经在上面的代码中更正了它。

这假设 artists 数组的每个成员都具有名为 'name'、'stock' 和 'price' 的属性。