TableView из файла JSON - сортировка данных - PullRequest
0 голосов
/ 05 октября 2019

Привет всем, я работаю с файлом JSON для заполнения UITableView.

Файл JSON содержит два поля, которые мне нужно использовать:

- "Имя" - "регион"

Поля "регион" должны быть назначены для создания разделов UITableView.

«имя» поля должны быть отсортированы в соответствии с разделом.

JSON-файл:

{
  "Università" : [
     {
      "nome" : "Università degli Studi di Trento",
      "regione" : "Trentino Alto Adige"
    },
     {
      "nome" : "Università per Stranieri di Reggio Calabria \"Dante Alighieri\"",
      "regione" : "Calabria"
    },
     {
      "nome" : "Università degli Studi Suor Orsola Benincasa",
      "regione" : "Campania"
    },
     {
      "nome" : "Università degli Studi della Calabria ",
      "regione" : "Calabria"
    },
     {
      "nome" : "Università degli Studi di Napoli \"L'Orientale\"",
      "regione" : "Campania"
    }
  ]
}

Как видно из JSON файл, каждый "имя" имеет "регион" , поэтому они должны быть отсортированы таким образом, например

(section) region 1
(cell) name with region 1
(cell) name with region 1
(cell) name with region 1

(section) region 2
(cell) name with region 2
(cell) name with region 2
(cell) name with region 2

Как можноЯ реализую это, чтобы заполнить мою UITableView?

Это реализация, которую я сделал до сих пор

-(void)retrieveUniversityListFromJSONFile {

    /* Interpelliamo il file JSON all'interno del progetto per ottenere i nomi di tutte le università attualmente presenti nel file */

    // Nome del file JSON
    NSString *JSONFileName = @"university";
    NSString *path = [[NSBundle mainBundle] pathForResource:JSONFileName ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];

    // Creazione di un dizionario che eredita informazioni dal file JSON
    NSDictionary *JSONDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

    // Inizializziamo l'array per prepararla ad accogliere i dati
    _universityList = NSMutableArray.new;

    for (NSDictionary *dict in JSONDict[@"Università"]) {

        // Otteniamo i nomi delle università presenti nel file
        NSString *universityName = dict[@"nome"];

        // Otteniamo i nomi delle regioni italiane
        NSString *regionName = dict[@"regione"];

        // Aggiungiamo i risultati per le regioni all'array || _regionList ||
        [_regionList addObject:regionName];

        // Aggiungiamo i risultati all'array || _universityList||
        [_universityList addObject:universityName];
    }
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return _regionList.count;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _universityList.count;
}

1 Ответ

0 голосов
/ 05 октября 2019

Вам необходимо манипулировать данными JSON в массиве, на который может ссылаться путь индекса табличного представления. Структура может быть массивом словарей с каждым словарем, содержащим регион, и списком связанных имен. Вам нужно будет выполнить итерацию данных JSON и создать новый массив словарей, добавив один для каждого нового региона, а затем добавив имя в массив имен в словаре этого региона. Ваша секция пути индекса и строка будут ссылаться на словарь и индекс имен соответственно.

Ваша функция может выглядеть следующим образом:

_regionList = [NSMutableArray array];

for (NSDictionary *dict in JSONDict[@"Università"]) {

    // Otteniamo i nomi delle università presenti nel file
    NSString *universityName = dict[@"nome"];

    // Otteniamo i nomi delle regioni italiane
    NSString *regionName = dict[@"regione"];

    BOOL found = NO;
    for (NSDictionary *regDict in _regionList) {
        if ([regDict[@"region_name"] isEqualToString:regionName]) {
             //Region exists already
             found = YES;

             if (regDict[@"names"] == nil) {
                 //name array does not exist, create new array
                 regDict[@"names"] = [NSMutableArray arrayWithObject:universityName];
             } else {
                 //name array does exist
                 regDict[@"names"] addObject:universityName];
             }

             break;
    }

    if (found == NO) {
       //Region does not exist, create new region dictionary
       NSMutableDictionary *newRegionDict = [NSMutableDictionary new];
       newRegionDict[@"region_name"] = regionName;
       newRegionDict[@"names"] = [NSMutableArray arrayWithObject:universityName];
    }
}

Пример структуры данных выше:

[ 
  [0]: { "region_name": "Calabria",
         "names": [ 
                   [0]: "Università per Stranieri di Reggio Calabria \"Dante Alighieri\"",
                   [1]: "Università degli Studi della Calabria"
                  ]
       },
  [1]: { "region_name": "Campania",
         "names": [ 
                   [0]: "Università degli Studi di Napoli \"L'Orientale\"",
                   [1]: "Università degli Studi Suor Orsola Benincasa"
                  ]
       }
]


Количество строкв разделе будет [_regionList[section][@"names"] count];

Ваш -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section может выглядеть так:

...
NSDictionary *region = _regionList[section];
NSString *regionName = _regionList[@"region_name"];

return regionName;

Ваш -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath:

...
NSDictionary *region = _regionList[indexPath.section];
NSString *uniName = _regionList[@"names"][indexPath.row];
...

Не забудьте позвонить[yourTableView reloadData] после манипулирования данными, на которые ссылается таблица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...