Вопрос по objective-c, iphone, uitableview, ios – Сортировка NSDictionary из JSON для UITableView

3

У меня возникают проблемы при попытке отсортировать мой NSDictionary по порядку, и это были недели, и я до сих пор не понял этого, поэтому я хотел бы, чтобы кто-нибудь мог помочь мне здесь ...

Данные NSDictionary взяты из JSON, и данные уже отсортированы с сервера, и они отображаются по порядку в JSON, но когда они извлекаются и преобразуются в NSDicitionary, порядок все неправильный ...

Это JSON

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

Количество категории и ее название не будут известны, пока не будет получен JSON, так что это то, что я использую для подсчета и настройки tableView и раздела

<code>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;
 }
</code>

И что я хочу сделать, это перечислить раздел и заголовок раздела как порядок в JSON .... вместо отображения хаоса, как

unknownCategory3
unknownCategory1
unknownCategory
unknownCategory2

& Quot; неизвестная категория & quot; Имя продукта категории, они не в алфавитном порядке, без какого-либо номера, и они уже отсортированы и отображаются в порядке в JSON ...

Так что было бы здорово, если бы вы, ребята, могли помочь. Заранее спасибо...

Ваш Ответ

4   ответа
0

что вы не можете редактировать? Это выглядит уродливо для меня. Категории должны быть массивом, и текущее размещение массива не имеет смысла. Если 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;
 }
Структура массива в JSON будет считана в NSArray в том же порядке, что и в JSON, поэтому вы делаете что-то не так.
Спасибо за напоминание JSON. Но похоже на порядок в NSDictionary * results = [jsonString JSONValue]; уже испорчен ... даже если я конвертирую & quot; результат & quot; в массив, порядок по-прежнему не такой же, как в JSON ... S Arumik
Вам не нужно преобразовывать его в массив. Вы читаете его как массив, и порядок останется прежним. NSArray * CategoriesArray = [Results ObjectForKey: @ & Quot; Categories & quot;];
пробовал ... не работает, порядок все еще испорчен ... = ( S Arumik
8

поэтому вам необходимо сначала отсортировать ключи, прежде чем использовать их в табличном представлении. Поэтому вместо использования [self.datasource allKeys] для получения заголовков разделов сначала создайте отсортированный массив: sorted = [[self.datasource allKeys] sortedArrayUsingSelector: @selector (caseInsensitiveCompare :)], а затем используйте этот массив для получения title: title = [отсортированный объектAtIndex: раздел].

После редактирования, чтобы ответить на следующий вопрос:

Чтобы использовать отсортированный массив, чтобы получить нужные значения в таблицу, я думаю, это должно быть близко. Вам нужно будет добавить свойство 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;
    }

Вы не сказали, как хотите отображать два разных значения в одной строке таблицы - в этом примере я объединил их в одну строку с возвратом между ними.

да, они строковые ... но они в японских символах, поэтому я не уверен, как их отсортировать, чтобы получить тот же порядок, что и в файле JSON ... S Arumik
Если это строки, вы можете отсортировать их по сравнению. Разве они не струны? Не имеет значения, отсортированы ли они в JSON, когда вы преобразуете его в словарь, он больше не обязательно будет в порядке.
@SArumik - элементы в JSON-объекте & quot; (эквивалент NSDictionary)definition не заказано. Если они появляются по порядку в исходной строке JSON, это будет рассматриваться как чистое совпадение.
значения заголовков разделов расположены не в алфавитном порядке и не содержат чисел, поэтому их нельзя сравнивать ... фактически они перечислены в порядке в JSON ... S Arumik
@rdelmar - Спасибо, да, отсортированный массив дал мне отсортированный неизвестный ключ для раздела. Но я не могу понять, как получить содержимое внутри, которое соответствует отсортированному порядку ключей ... было бы здорово, если бы вы могли показать мне немного больше ... спасибо. S Arumik
1

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

И это очень легко отсортировать, если вы сделали, как указано выше.

To sort JSON provided in your question

-(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 будет держать отсортированный словарь

спасибо, я мог бы заставить DictionaryMutable работать и показывать его по порядку в nslog, но как я могу получить данные внутри, которые будут отображаться по порядку в каждом разделе? S Arumik
0

что единственный способ сохранить исходный порядок - это выполнить первоначальный анализ самостоятельно после создания строки JSON из данных JSON. Если структура строки JSON такая же, как вы отправили, вы можете использовать NSScanner, чтобы найти строки между кавычками, а затем выбрать только те, которые имеют [после последней кавычки, чтобы добавить в массив, который будет вашим заказом. массив ключей. Затем вы можете создать NSDictionary с помощью анализатора JSON и получить значения, просматривая упорядоченные ключи и отправляя их valueForKey :.

Похожие вопросы