編集:
あなたはあなたが持っていると言います
NSMutableDictionary *menuEntries;
次のように入力されます:
menuEntries = [[NSMutableDictionary alloc] init];
[menuEntries setObject:mainMenuArray forKey:@"First section"];
[menuEntries setObject:self.magazineMenuArray forKey:@"Second section"];
入力する順序を尊重する場合は、NSMutableArray
代わりに次のように使用する必要があります。
NSMutableArray *menuEntries;
次に、その配列に、少なくとも2つのキー、セクションのタイトル用のキーとそのセクションの行用のキーを含む辞書エントリを入力できます。したがって:
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
オブジェクトの背後で使用する非常に一般的なデータモデルの概要です。これは、テーブルビュー自体に対応する優れた論理構造です。基本的に、これはセクションの配列であり、各セクションは、セクションのタイトル用と行用の2つのキーを持つ辞書です。その「セクションの行」の値は、それ自体が配列であり、テーブルの行ごとに1つのエントリです。複雑に聞こえますが、上記のように、実際には実装が非常に簡単になります。
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クラスリファレンスのソートを確認してください。