Ios UITableview、NSArray和NSDictionnaries//订购

Ios UITableview、NSArray和NSDictionnaries//订购,ios,uitableview,Ios,Uitableview,我必须查看UITableview,字典中包含的章节标题,与每个标题相关联的数组中的内容(这些数组创建单元格) 在这里,很多人都回答了订购词典的问题,这很难,等等… 即使一个单词不能排序,或者有困难,它怎么每次都保持相同的顺序 示例 假设我最终得到一个表视图,它有两个部分(标题),每个部分都包含一些单元格 声明了一个词汇表,它包含章节标题 NSMutableDictionary *menuEntries; 对于这些词汇条目中的每一个,都会关联一个不同的数组(然后用于创建和填充单元格)。我们将有

我必须查看UITableview,字典中包含的章节标题,与每个标题相关联的数组中的内容(这些数组创建单元格)

在这里,很多人都回答了订购词典的问题,这很难,等等… 即使一个单词不能排序,或者有困难,它怎么每次都保持相同的顺序


示例

假设我最终得到一个表视图,它有两个部分(标题),每个部分都包含一些单元格

声明了一个词汇表,它包含章节标题

NSMutableDictionary *menuEntries;
对于这些词汇条目中的每一个,都会关联一个不同的数组(然后用于创建和填充单元格)。我们将有两个部分(因此在字典中有两个键),出于某些原因,我们将使用两个不同的数组来关联这些键

NSArray *mainMenuArray;
NSMutableArray *magazineMenuArray;
第一个是这样填充的(

第二个数组(magazineMenuArray)是通过一些json调用填充的(这里没有显示如何填充,但一切都很好)

所以我们最终设置了辞典

menuEntries = [[NSMutableDictionary alloc] init];
[menuEntries setObject:mainMenuArray forKey:@"First section"];
[menuEntries setObject:self.magazineMenuArray forKey:@"Second section"];
最后,它运行得非常好,我们为数组的对象定义了一些属性,一个用于标题,一个用于要调用的动作,非常酷


!!但是!!


第二节出现在第一节之前。对此无需采取任何措施。始终

我听说一个字典是不能订购的,好吧,但我真的觉得,在这种情况下,它是以某种方式订购的


这非常令人困惑。

NSDictionary每次都保持相同的顺序,但这是基于作为键插入的对象的哈希代码的任意顺序。如果字典是可变的,则插入或删除对象可以更改字典中已存在的键的顺序

尽管无法对字典本身进行排序,但确实可以将其键排序到单独的数组中,然后按顺序遍历该数组,从(无序的)字典中按键拖动对象。

编辑:

你说你有

NSMutableDictionary *menuEntries;
其填充为:

menuEntries = [[NSMutableDictionary alloc] init];
[menuEntries setObject:mainMenuArray forKey:@"First section"];
[menuEntries setObject:self.magazineMenuArray forKey:@"Second section"];
如果希望它遵守填充顺序,则应使用
NSMutableArray
,例如:

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]];
因此,

就我个人而言,我不会到处使用文字字符串
@“title”
@“rows”
,而是定义如下常量,在实现开始时包含这些常量,并使用它们代替文字字符串。但我相信您已经了解了基本的想法

NSString * const kTableTitleKey = @"title";
NSString * const kTableRowsKey  = @"rows";
无论如何,这概括了我在
UITableView
对象后面使用的一个非常常见的数据模型。它是一个很好的逻辑结构,对应于表视图本身。本质上它是一个节数组,每个节都是一个字典,有两个键,一个用于标题,一个用于节的行。该值“rows of the section”本身就是一个数组,表中的每一行都有一个条目。这听起来很复杂,但正如上面所看到的,它实际上使实现非常非常简单


我的原始答案是在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类参考。

您能澄清一下词典的结构吗?通常您会看到一系列词典条目(我得到了一个解决这种情况的答案)。如果您没有处理字典条目数组,您必须提供一个示例,说明您的字典是什么样子的,我们可以提供进一步的帮助。感觉它将是重复的,但我搜索了很长时间,仍然找不到关于它的线索,也找不到如何“排序”这段代码的线索。我是否应该放弃字典,只使用而不是数组?寻找一个好的模式来实现它我所做的是一个数组的字典;你的是一个数组的字典。听起来非常好,我必须尝试it@Ben我已经更新了我的答案,向您展示了实现的样子。
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}
];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
                                                           ascending:YES];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:@[descriptor]];

NSLog(@"array = %@", array);
NSLog(@"sortedArray = %@", sortedArray);