UITableView中的第二个视图不会显示来自JSON的已解析数据

时间:2013-01-05 11:28:20

标签: iphone ios json uitableview nsjsonserialization

我有来自JSON文件的解析数据。它在我的UITableView的第一个视图中就像一个魅力。但是,当我点击某个项目时,它会显示一个空白的第二个视图。

MasterView.h

@interface MasterViewController : UITableViewController
{
    NSArray *json;
}

@property (nonatomic, retain) NSArray *json;

@end

MasterView.m

#import "MasterViewController.h"
#import "InformationViewController.h"

@interface MasterViewController ()

@end

@implementation MasterViewController

@synthesize json;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://j4hm.t15.org/ios/console.php"]];
    [self performSelectorOnMainThread: @selector(fetchedData:) withObject: jsonData waitUntilDone: YES];
}

- (void)fetchedData:(NSData *)responseData
{
    NSError *error;

    self.json = [NSJSONSerialization JSONObjectWithData: responseData options: kNilOptions error: &error];

    NSLog(@"String is %@", self.json);
}

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

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

// Customize the appearance of table view cells.
- (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;
    }

    cell.textLabel.text = [[json objectAtIndex: indexPath.row] objectForKey: @"Console"];

    [cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator];

    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    InformationViewController *informationViewController = [[InformationViewController alloc] initWithStyle:UITableViewStylePlain];

    informationViewController.title  = [[json objectAtIndex: indexPath.row] objectForKey: @"Console"];
    informationViewController.Information = [[json objectAtIndex: indexPath.row] objectForKey: @"Model"];

    NSLog(@"String is %@", informationViewController.Information);

    [self.navigationController pushViewController: informationViewController animated:YES];

}

InformationView.h

@interface InformationViewController : UITableViewController

@property (nonatomic, strong) NSArray * Information;

@end

InformationView.m

@interface InformationViewController ()

@end

@implementation InformationViewController

@synthesize Information;

- (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];
    }

    // Configure the cell...

    cell.textLabel.text = [[Information objectAtIndex: indexPath.row] objectForKey: @"Model"];

    [cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator];

    return cell;
}

3 个答案:

答案 0 :(得分:1)

在这里,我发布了另一个答案,因为我不想产生混淆。

The Project Codehttp://www.cogzentappz.com/demo/iostutorial/TestJson.zip

而不是传递所选值,将整个Array传递给NSUsedDefaults并使用以下代码将其复制。

  - (void)fetchedData:(NSData *)responseData
    {
        NSError *error;

        self.json = [NSJSONSerialization JSONObjectWithData: responseData options: kNilOptions error: &error];

        NSLog(@"String is %@", self.json);

     NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
        NSMutableArray *arrayObj = [[NSMutableArray alloc] init];


        for(int i = 0 ; i<[self.json count] ; i++) {
            [arrayObj addObject:[json objectAtIndex:i]]];
        }

        [standardDefaults setObject:arrayObj forKey:@"longArray"];
        [arrayObj release];


    }

在下一个视图中,您可以使用Below方法返回数据。  在ViewDidLoad的{​​{1}}中使用此

informationViewcontroller

根据您的链接Json输出如下:

//reading

NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayObj = [standardDefaults objectForKey:@"longArray"];


for(int i = 0 ; i<[arrayObj count] ; i++) {
        NSLog(@"String is %@",[arrayObj objectAtIndex:i]);
    }

转到链接:http://json.bloople.net并发布所有json输出并按Enter键。

所以你必须根据那种格式获得价值。

NSArray-->NSDictionary-->NSArray-->NSDictionary-->NSArray-->NSDictionary

答案 1 :(得分:0)

使用此

更改MaterView.m的代码
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
InformationViewController *informationViewController = [[InformationViewController alloc] initWithStyle:UITableViewStylePlain];
informationViewController.title  = [[json objectAtIndex: indexPath.row] objectForKey: @"Console"];
informationViewController.Information = [[json objectAtIndex: indexPath.row] objectForKey: @"Model"];
NSLog(@"String is %@", informationViewController.Information);
[self.navigationController pushViewController: informationViewController animated:YES];
}

希望它对你有所帮助......

答案 2 :(得分:0)

我认为您在获取数据后必须重新加载数据。现在,您指定NSArrray *json为空,因为计数返回0.因此,您禁止填充表视图。获取数据后请致电[tableView reloadData];