![](/img/trans.png)
[英]Displaying data in expandable/collapsible UITableView from JSON (objective-c)
[英]JSON data to UITableView using Objective-C
-使用主要JSON文件的更新問題-
我正在嘗試將名稱添加到表視圖。 但是表始終是空的。 (Xcode 7.1b1,iOS 9.1b2)這只是我用來測試代碼的示例.json文件。 主json文件包含更多數據。
我成功地添加了示例json文件中的數據。 但是現在在使用主json文件之后,該表再次為空。
.json文件
[
{
"150978": {
"jobs": {
"D0-C14008-CW": {
"05-9032": {
"G-05": {
"hours_rwk": "False",
"hours_st": "4L",
"hours_ewo_id": "D0-C14008-CWddda",
"hours_ewo": "True",
"hours_dt": "0L",
"hours_ot": "0L",
"comments": ""
}
},
"05-9031": {
"B-02": {
"hours_rwk": "False",
"hours_st": "4L",
"hours_ewo_id": "",
"hours_ewo": "False",
"hours_dt": "0L",
"hours_ot": "0L",
"comments": ""
}
}
}
},
"name": "CirilloBetancourt",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "",
"signed_in": "True",
"time_in": "08: 30",
"time_out": "16: 30",
"signed_out": "True"
},
"151243": {
"jobs": {},
"name": "JasonDiaz",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"151248": {
"jobs": {},
"name": "AngelTorresMadrigal",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"151336": {
"jobs": {},
"name": "DanielFrey",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"151419": {
"jobs": {
"D0-C14009-CW1": {
"05-9033": {
"G-07": {
"hours_rwk": "False",
"hours_st": "8L",
"hours_ewo_id": "0",
"hours_ewo": "False",
"hours_dt": "0L",
"hours_ot": "0L",
"comments": ""
}
}
},
"D0-C14008-CW": {
"05-9031": {
"B-02": {
"hours_rwk": "False",
"hours_st": "0L",
"hours_ewo_id": "0",
"hours_ewo": "True",
"hours_dt": "0L",
"hours_ot": "2L",
"comments": ""
}
}
}
},
"name": "MikeGullan",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9990666": {
"jobs": {},
"name": "MattStaricha",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9992610": {
"jobs": {},
"name": "MatthewBigelow",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9992778": {
"jobs": {},
"name": "ZhouTan",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9993273": {
"jobs": {},
"name": "RandyFarinelli",
"site_id": "D0-C14008-CW",
"trade": "Carpenter",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9996467": {
"jobs": {},
"name": "AlvaroSandoval(Guardado)",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9996763": {
"jobs": {},
"name": "JesusZarate",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9996767": {
"jobs": {},
"name": "JorgeRomero",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9996768": {
"jobs": {
"D0-C14008-CW": {
"05-9032": {
"G-05": {
"hours_rwk": "False",
"hours_st": "3L",
"hours_ewo_id": "0",
"hours_ewo": "False",
"hours_dt": "0L",
"hours_ot": "0L",
"comments": ""
}
},
"05-9031": {
"B-02": {
"hours_rwk": "False",
"hours_st": "5L",
"hours_ewo_id": "0",
"hours_ewo": "False",
"hours_dt": "0L",
"hours_ot": "0L",
"comments": ""
}
}
}
},
"name": "VictorRuiz",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9996771": {
"jobs": {},
"name": "GabinoMata-Neri",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9999247": {
"jobs": {
"D0-C14008-CW": {
"05-9032": {
"G-05": {
"hours_rwk": "False",
"hours_st": "8L",
"hours_ewo_id": "0",
"hours_ewo": "False",
"hours_dt": "0L",
"hours_ot": "0L",
"comments": ""
}
},
"05-9031": {
"B-02": {
"hours_rwk": "True",
"hours_st": "0L",
"hours_ewo_id": "0",
"hours_ewo": "False",
"hours_dt": "0L",
"hours_ot": "1L",
"comments": ""
}
}
}
},
"name": "FranciscoMontez",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
},
"9999314": {
"jobs": {},
"name": "RomanHernandez",
"site_id": "D0-C14008-CW",
"trade": "Mason",
"note": "nowork",
"signed_in": "False",
"time_in": "06: 00",
"time_out": "06: 00",
"signed_out": "False"
}
}
]
.h文件
#import <UIKit/UIKit.h>
@interface TableViewController : UITableViewController
@property (nonatomic, strong) NSArray *nameArray;
@property (nonatomic, strong) NSArray *dict;
@property (nonatomic, strong) NSData *data;
@property (nonatomic, strong) NSString *filePath;
@end
.m文件
#import "TableViewController.h"
#import "TableViewCell.h"
@interface TableViewController ()
@end
@implementation TableViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
NSError *error = nil;
_filePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
_data = [NSData dataWithContentsOfFile:_filePath];
_dict = [NSJSONSerialization JSONObjectWithData:_data options:0 error:&error];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//#warning Incomplete implementation, return the number of sections
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//#warning Incomplete implementation, return the number of rows
return _dict.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableCell" forIndexPath:indexPath];
// Configure the cell...
NSDictionary *dict = _dict[indexPath.row];
NSString *name = dict[@"name"];
cell.titleLabel.text = name;
return cell;
}
您的JSON格式錯誤。 它可能應該是:
[
{
"name": "XYZ",
"details": "XYZ"
},
{
"name": "XYZ",
"details": "XYZ"
}
]
當您執行_dict = [NSJSONSerialization JSONObjectWithData:_data options:0 error:&error];
您實際上得到的是一個字典數組,而不是一個字典。 因此,調用_nameArray = [_dict objectForKey:@"name"];
應該實際上返回nil
或崩潰。
這是您的實現應如下所示:
#import "TableViewController.h"
#import "TableViewCell.h"
@interface TableViewController ()
@end
@implementation TableViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSError *error = nil;
_filePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
_data = [NSData dataWithContentsOfFile:_filePath];
// Remember here, __dict is an array, I kept the same name as your code but it is NOT a dictionary.
_dict = [NSJSONSerialization JSONObjectWithData:_data options:0 error:&error];
_nameArray = [_dict objectForKey:@"name"];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _dict.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableCell" forIndexPath:indexPath];
// Remember here, __dict is an array, I kept the same name as your code but it is NOT a dictionary.
NSDictionary *dict = _dict[indexPath.row];
NSString *name = dict[@"name"];
cell.titleLabel.text = name;
return cell;
}
鍵“名稱”將不會返回數組。 它將返回一個NSString
。
您的JSON似乎是字典數組。 因此,這是解決問題的方法:
從JSON解析數據時,保存在NSArray
:
@property (nonatomic, strong) NSArray *jsonArray;
self.jsonArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
然后在讀取單元格中的數據時,請像這樣讀取數據:
NSDictionary *nameDict = self.jsonArray[0];
NSLog(@"Name = %@", nameDict[@"name"]); // This prints Name = XYZ
.json文件的實際格式應如下所示:
[
{
"name": "XYZ",
"details": "XYZ"
},
{
"name": "XYZ",
"details": "XYZ"
}
]
現在,您的.m文件應如下所示:
NSError *error = nil;
_filePath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
_data = [NSData dataWithContentsOfFile:_filePath];
_dataArray = [NSJSONSerialization JSONObjectWithData:_data options:0 error:&error];
//_nameArray = [_dict objectForKey:@"name"];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableCell" forIndexPath:indexPath];
NSDictionary *dict = [self.nameArray objectAtIndex:indexPath.row];
cell.titleLabel.text = dict[@“name”];
return cell;
}
希望這可以幫助。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TableCell" forIndexPath:indexPath];
// Configure the cell...
NSString *name = [self.nameArray objectAtIndex:indexPath.row];
cell.titleLabel.text = name;
//NSString *desc = [self.results objectForKey:@""];
return cell;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.