使用 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' 的属性。
我想使用分段控件对 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' 的属性。