2

JSONクエリから作成されたNSMutableDictionaryがあり、ブラウザでjsonクエリを実行すると、出力が必要に応じてアルファベット順に並べられ、NSLOGを使用して正しい順序でこれを表示すると、これが確認されます。ただし、 UITableView セルにデータを入力すると、順序がまったく異なりますが、元の順序を維持したいと考えています。

辞書は順序付けられるように設計されていないことを理解しており、新しい並べ替えられた配列にマップできますが、これを行うと (これがこれを達成する正しい方法である場合)、詳細ビューの正しいキーとインデックスに対処する方法が不明です. 何かご意見は?ありがとう。

JSON データを作成し、テーブル セルを作成するためのコードは次のとおりです。

- (void) makeData {
    //Define dictionary
    fullDictionary = [[NSMutableDictionary alloc] init];

    //parse JSON data from a URL into an NSArray
    NSString *urlString = [NSString stringWithFormat:@"http://<JSON feed goes here>"];
    NSURL *url = [NSURL URLWithString:urlString];
    NSData *data = [NSData dataWithContentsOfURL:url];
    NSError *error;
    fullDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // cell data - extracting the appropriate values by object rows
    cell.textLabel.text = [[[fullDictionary allValues] valueForKeyPath:@"strTerm"] objectAtIndex:indexPath.row];

    return cell;
}
4

1 に答える 1

1

コードから判断すると、辞書から適切な配列を取得する方法を知っているように見えます。これは、明らかに配列を使用して の現在の値を設定しているためですcell.textLabel。そのコードをリバース エンジニアリングすると、並べ替えられていない配列は次のように決定されるように見えます。

NSArray *originalArray = [[fullDictionary allValues] valueForKeyPath:@"strTerm"];

あとは、その配列をソートするだけです。文字列の単純な配列である場合は、次のように簡単に実行できます。

NSArray *sortedArray = [originalArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

より複雑な辞書エントリの配列などを扱っている場合は、優れた制御を提供する並べ替えメソッドの順列があります。JSON の結果を並べ替える方法として、より複雑な並べ替え方法については、こちらを参照してください: Filtering UITableView from XML source。それはあなたの問題とは別の問題ですが、 で何ができるかの感覚が得られるかもしれませんsortedArrayUsingComparator

于 2012-11-29T16:34:52.250 に答える