编辑:
你说你有
NSMutableDictionary *menuEntries;
其中填充为:
menuEntries = [[NSMutableDictionary alloc] init];
[menuEntries setObject:mainMenuArray forKey:@"First section"];
[menuEntries setObject:self.magazineMenuArray forKey:@"Second section"];
如果您希望它尊重您填充它的顺序,您应该使用 aNSMutableArray
代替,例如:
NSMutableArray *menuEntries;
然后,您可以用字典条目填充该数组,其中至少有两个键,一个是部分的标题,另一个是该部分的行。因此:
menuEntries = [[NSMutableArray alloc] init];
[menuEntries addObject:[NSDictionary dictionaryWithObjectsAndKeys:
@"First section", @"title",
mainMenuArray, @"rows",
nil]];
[menuEntries addObject:[NSDictionary dictionaryWithObjectsAndKeys:
@"Second section", @"title",
self.magazineMenuArray, @"rows",
nil]];
因此,
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [menuEntries count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSDictionary *section = [menuEntries objectAtIndex:section];
return [section objectForKey:@"title"];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSDictionary *section = [menuEntries objectAtIndex:section];
return [[section objectForKey:@"rows"] count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *section = [menuEntries objectAtIndex:indexPath.section];
NSArray *rows = [section objectForKey:@"rows"];
id row = [rows objectAtIndex:indexPath.row];
// I didn't know how mainMenuArray and self.magazineMenuArray were populated,
// so I used a data type of `id` for the row, but you can obviously replace
// that with whatever is appropriate, e.g., NSDictionary* or whatever.
// proceed with the configuring of the cell here
}
就个人而言,我不会到处使用文字字符串@"title"
,@"rows"
而是定义如下常量,在实现开始时包含这些常量,并使用它们代替文字字符串。但我相信你明白基本的想法。
NSString * const kTableTitleKey = @"title";
NSString * const kTableRowsKey = @"rows";
无论如何,这概述了我在UITableView
对象后面使用的一个非常常见的数据模型。这是一个很好的逻辑结构,对应于表视图本身。本质上,它是一个节数组,每个节都是一个带有两个键的字典,一个用于标题,一个用于节的行。“该部分的行”的值本身就是一个数组,表的每一行都有一个条目。这听起来很复杂,但正如您在上面看到的,它实际上使实现非常非常简单。
我的原始答案是在 OP 提供有关数据结构性质的任何信息之前提供的。因此,我为更抽象的问题提供了一个答案,即如何对字典条目数组进行排序。不过,我保留该答案以供历史参考:
原答案:
我不确定您如何存储字典以及如何表示表中的行,但一种常见的模式是拥有一个字典项数组:
NSArray *array = @[
@{@"id" : @"1", @"name":@"Mo", @"age":@25},
@{@"id" : @"2", @"name":@"Larry", @"age":@29},
@{@"id" : @"3", @"name":@"Curly", @"age":@27},
@{@"id" : @"4", @"name":@"Shemp", @"age":@28}
];
然后,您可以通过 对其进行排序name
,如下所示:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[descriptor]];
NSLog(@"array = %@", array);
NSLog(@"sortedArray = %@", sortedArray);
排序方法有一整套,请查看NSArray 类参考中的排序。