JSON 文件中的 TableView - 对数据进行排序

Posted

技术标签:

【中文标题】JSON 文件中的 TableView - 对数据进行排序【英文标题】:TableView from JSON file - sort data 【发布时间】:2019-10-05 16:04:04 【问题描述】:

大家好,我正在使用JSON 文件来填充UITableView

JSON 文件有两个我需要使用的字段:

-“名字” - “地区”

必须为创建UITableView 部分分配“区域” 字段。

"name" 字段必须按部分排序。

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 文件中可以看出,每个"name" 都有一个"region",因此它们必须以例如这种方式排序

(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】:

您需要将 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"
                  ]
       
]

section 中的行数为[_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]

【讨论】:

您好,很抱歉我的回答延迟了。所以我正在尝试实施您的建议,但我不明白您为什么调用“区域”键而不是“区域名称”。我按照您的建议修改了我的 JSON 文件,但是对于这个点,“区域”键不再列出。这就是我实现 JSON 文件的方式 "Università" : [ [0]: "regione": "Abruzzo", "nome": [ [0]: "Università degli Studi \"Gabriele d'Annunzio\"", ]“纬度”:[[0]:42.368174]“经度”:[[0]:14.14877]],] 你能帮我更好地理解这一点吗?

以上是关于JSON 文件中的 TableView - 对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON 和 AFNetworking NSDictionary 使用数据填充 tableview

如何从本地 JSON 文件解析数据并保存在模型类中并在 tableview 中使用

在 Swift 中加速 TableView 加载 JSON

您好,我是 iOS 开发新手,我很难用 json 数据填充嵌入在 UIviewcontroller 中的 tableview

问:带有 JSON 文件的 SearchBar Tableview

从 JSON 数据向 tableview 添加部分的问题