1

UITableview、辞書に含まれるセクションヘッダーのタイトル、各タイトルに関連付けられた配列の内容(これらの配列はセルを作成します)を実行する必要があります。

多くの人がここで辞書の注文について答えているのは問題ありませんが、それはかなり難しいことなどです。辞書を注文できない場合でも、どのようにして毎回同じ順序を維持するのでしょうか。


それぞれがいくつかのセルを含む2つのセクション(タイトル付き)を持つテーブルビューになってしまったとしましょう

辞書が宣言され、セクションのタイトルが含まれています。

NSMutableDictionary *menuEntries;

これらの辞書エントリごとに、異なる配列が関連付けられています(これは、セルの作成と入力に使用されます)。2つのセクションがあります(つまり、辞書には2つのキーがあります)。いくつかの理由で、これらのキーに関連付ける2つの異なる配列を使用します。

NSArray *mainMenuArray;
NSMutableArray *magazineMenuArray;

最初のものはこのように入力されます(

mainMenuArray = [[NSArray alloc] initWithObjects: btn1,btn2,btn3,btn4,nil];

2番目の配列(magazineMenuArray)は、json呼び出しを介して入力されます(ここでは方法を示していませんが、すべてが正常に機能します)

だから私たちは辞書を設定することになります

menuEntries = [[NSMutableDictionary alloc] init];
[menuEntries setObject:mainMenuArray forKey:@"First section"];
[menuEntries setObject:self.magazineMenuArray forKey:@"Second section"];

結局、それはかなりうまく機能します。配列のオブジェクトにいくつかの属性を定義しました。1つはタイトル用、もう1つは呼び出されるアクション用で、かなりクールです。


!! しかし !!


2番目のセクションは最初のセクションの前に表示されます。それについて/それに対して何もすることはありません。いつも。

NSDictionnaryを注文できないと聞きましたが、その場合はどういうわけか注文されたように感じます。

それは非常に紛らわしいです。

4

2 に答える 2

2

NSDictionary毎回同じ順序を維持しますが、これは、キーとして挿入するオブジェクトのハッシュコードに基づく任意の順序です。ディクショナリが変更可能である場合、オブジェクトを挿入または削除すると、すでにディクショナリにあるキーの順序が変更される可能性があります。

辞書自体を並べ替えることはできませんが、キーを別の配列に並べ替えてから、その配列を順番にたどり、(順序付けされていない)辞書からキーごとにオブジェクトを取得することは確かに可能です。

于 2012-12-12T15:10:45.223 に答える
1

編集:

あなたはあなたが持っていると言います

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クラスリファレンスのソートを確認してください。

于 2012-12-12T16:49:55.500 に答える