簡體   English   中英

使用Objective-C的JSON數據到UITableView

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM