使用JSON数据在UITableView中设置textLabel.text

时间:2012-02-07 21:24:35

标签: ios5

我将在问题的前言,我是iOS的新手,可以使用一点点。我一直试图弄清楚这几天,并担心我无法通过挫折找出解决方案。我希望一些有经验的新眼睛能够帮助我解决这个问题。

我有一个JSON文件,我想用于我的应用程序的各个部分。可以在https://raw.github.com/irong8/stronger-nation-data/master/data.json查看该文件以供参考。

我正在使用Storyboard,并希望使用iOS5的内置JSON支持来实现这一目标。我创建了一个新的TableViewController子类,并包含了下面的代码。

这是我的.h文件

#import <UIKit/UIKit.h>

@interface StateTableViewController : UITableViewController
{
    NSArray *StateList;
}

@property (nonatomic, retain) NSArray *StateList;

- (void) buildStateList;

@end

这是我的.m文件

#import "StateTableViewController.h"

@implementation StateTableViewController

@synthesize StateList;

- (void)buildStateList {
    NSString *jsonFile = [ [NSBundle mainBundle] pathForResource:@"data" ofType:@"json" ];
    NSError *jsonError = nil;

    NSData *jsonData = [NSData dataWithContentsOfFile:jsonFile options:kNilOptions error:&jsonError ];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&jsonError];

    NSArray *jsonArray = [json objectForKey:@"states"];

    self.StateList = jsonArray;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self buildStateList];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [StateList count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];

    return cell;

}

我可以使用以下内容遍历StateList数组,并查看我要查找的州名。

for (NSString *element in StateList) {
    NSLog(@"element: %@", element);
}

当我加载此视图时,TableView加载了50行(正如预期的那样,我的数据文件中有50个状态记录),每行编号为0-49。我无法弄清楚如何在StateList数组中访问状态名称。

一路上的任何帮助都将非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用cellForRow..中的数据填充tableview的单元格。以下是对新项目中默认实现的略微修改:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    // Configure the cell.
    NSInteger rowNumber = indexPath.row;
    NSString *stateName = [StateList objectAtIndex:rowNumber];
    cell.textLabel.text = stateName;
    return cell;
}

编辑您的应用现在崩溃的原因是密钥"states"的对象是字典(因为它应该根据您发布的链接上的json )你不能简单地把它投射到一个数组。但是,您可以向字典询问所有键的数组。在这种情况下,将是州名。

更改buildStateList中的这行代码:

NSArray *jsonArray = [[json objectForKey:@"states"] allKeys];