3

NSDictionary を順番に並べ替えるのに苦労しています。何週間も経ちましたが、まだ理解できていません。

NSDictionary のデータは JSON から取得しており、既にサーバーからデータがソートされ、JSON で順番に表示されているのですが、取得して NSDictionary に変換すると、順番がすべて間違っています...

これはJSONです

{ 
  "categories":{
   "unknownCategoryName":[
   { "key1":"value1",
     "key2":"value2"
   }],
   "unknownCategoryName1":[
   { "key1":"value1",
     "key2":"value2"
   }],
   "unknownCategoryName2":[
   { "key1":"value1",
     "key2":"value2"
   }],
   "unknownCategoryName3":[
   { "key1":"value1",
     "key2":"value2"
   }]
  }
 }

カテゴリの数量とその名前は JSON が受信されるまでわからないため、これを使用してカウントを取得し、tableView とセクションを設定しています

NSDictionary *results = [jsonString JSONValue];

NSDictionary *all = [results objectForKey:@"categories"];
self.datasource = all;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
   return [self.datasource count];
  }

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
   NSString *title = [[self.datasource allKeys] objectAtIndex:section];
   return title;
 }

そして、私がやりたいのは、セクションとセクションのタイトルをJSONの順序でリストすることです....のような混乱した表示ではなく

不明
カテゴリ3 不明カテゴリ 1 不明カテゴリ
不明カテゴリ
2

「unknownCategory」は製品カテゴリ名で、アルファベット順ではなく、番号なしで、JSON で既にソートされて順番に表示されています...

ですから、皆さんが助けてくれれば、それは素晴らしいことです。前もって感謝します...

4

4 に答える 4

8

キーは NSDictionaries で順序付けされていないため、テーブル ビューでキーを使用する前に、まずキーを並べ替える必要があります。したがって、[self.datasource allKeys] を使用してセクション タイトルを取得する代わりに、まず並べ替えられた配列を作成します: sorted = [[self.datasource allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]。タイトル: タイトル = [並べ替えられた objectAtIndex:section]。

編集後、さらに質問に答えます。

ソートされた配列を使用してテーブルに必要な値を取得するには、これに近いはずです。プロパティ NSArray *sorted を .h ファイルに追加してから、これを .m に追加する必要があります (これは、json の構造が上に投稿したとおりであると想定しています)。

 NSDictionary *results = [jsonString JSONValue];
    NSDictionary *all = [results objectForKey:@"categories"];
    self.datasource = all;
    self.sorted = [[self.datasource allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return [self.sorted count];
    }

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        NSString *title = [self.sorted objectAtIndex:section];
        return title;
    }

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [[self.datasource valueForKey:[self.sorted objectAtIndex:section]]count];
   }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *cellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        }
        NSArray *theArray = [self.datasource valueForKey:[self.sorted objectAtIndex:indexPath.section]];
        NSString *text1 = [[theArray objectAtIndex:0] valueForKey:@"key1"];
        NSString *text2 = [[theArray objectAtIndex:0] valueForKey:@"key2"];
        cell.textLabel.text = [NSString stringWithFormat:@"%@\r%@",text1,text2];
        cell.textLabel.numberOfLines=0; // this set the number of lines to unlimited
        return cell;
    }

2 つの異なる値を 1 つのテーブル行に表示する方法については言及していませんでした。この例では、それらを 1 つの文字列に連結し、その間に改行を入れています。

于 2012-04-30T15:55:29.573 に答える
1

奇妙なJSONのようです。あなたはこのように使うことができたでしょう

{
"categories": [
    "unknownCategoryName": [
        {
            "key1": "value1",
            "key2": "value2"
        }
    ],
    "unknownCategoryName2": [
        {
            "key1": "value1",
            "key2": "value2"
        }
    ]
]
}

そして、あなたが上記のようにしたならば、それは分類するのが非常に簡単です。

質問で提供されたJSONを並べ替える

-(NSMutableArray *)getAllKeys:(NSDictionary *)jsonDictionary{

       NSDictionary *all = [results objectForKey:@"categories"];
       NSMutableArray *allKeys = [all allKeys];
       NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
       NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; 

       [allKeys sortUsingDescriptors:sortDescriptors]; 
       [sorter release];

       return allkeys;
   }

   -(void)createSortedDictionary{
        NSMutableDictionary *dictionaryMutable=[NSMutableDictionary dictionary];
        for(NSString *string in allkeys){

           [dictionaryMutable setObject:[all objectForKey:string] forKey:string];
        }
     }

dictionaryMutableソートされた辞書を保持します

于 2012-04-30T16:54:49.840 に答える
0

元の順序を維持できる唯一の方法は、JSON データから JSON 文字列を作成した後、最初の解析を自分で行うことだと思います。JSON 文字列の構造が投稿したとおりであれば、NSScanner を使用して引用符の間の文字列を検索し、最後の引用符の後に [ があるものだけを選択して、配列に追加することができます。キーの配列。その後、JSON パーサーを使用して NSDictionary を作成し、順序付けられたキーをループして valueForKey: を送信することで値を取得できます。

于 2012-05-01T01:15:29.513 に答える
0

この JSON は自分で作成したものですか、それとも編集できない場所から取得したものですか? 私には奇形に見えます。カテゴリは配列である必要があり、現在の配列の配置は意味がありません。JSON が次のようになっている場合:

{ 
  categories:[
   {unknownCategoryName:
   { key1:value1,
     key2:value2
   }},
   {unknownCategoryName2:
   { key1:value1,
     key2:value2
   }}
  ]
 }

次に、カテゴリを NSArray に読み込むことができ、デリゲート メソッドは次のようになります (適切な順序で表示されます)。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      return [categoriesArray count];
  }

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
     NSDictionary *dict = [categoriesArray objectAtIndex:section];  
     NSString *title = [[dict allKeys] objectAtIndex:0];
     return title;
 }
于 2012-04-30T15:37:46.433 に答える