ios - JSON 文件中的 TableView - 对数据进行排序
问题描述
大家好,我正在使用一个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;
}
解决方案
您需要将 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]
操作表引用的数据后不要忘记调用。
推荐阅读
- android - 如何从 Item.java 文件获取方法 CardListAdapter.java 文件?
- javascript - 嵌套的异步 ForEach 循环
- elm - 如何在 Elm 中制作一组独特的记录
- spring - 使用 Git 的 Spring Cloud 配置安全性
- javascript - 自定义动态创建的元素,添加通过弹出窗口选择的选项
- javascript - 无法接收从 html 中的 rest api 传递的 json 响应
- kubernetes - Kubernetes 编排
- angular - 如何根据数据的多次订阅返回我自己的 observable
- java - 如何解决无输出问题-使用while-?
- macros - 扩展 SPF 宏