在 UITableView 中显示 Json 结果

Posted

技术标签:

【中文标题】在 UITableView 中显示 Json 结果【英文标题】:Displaying Json result in UITableView 【发布时间】:2013-04-22 14:55:22 【问题描述】:

我正在尝试将我的JSON 结果放入我的UITableView。我得到了JSON,但我不能把它们放到我的桌面视图中。知道我做错了什么吗?

以下是一些相关代码:

- (void)viewDidLoad 
    TitlosArray = [[NSMutableArray alloc] init];
    KeimenoArray = [[NSMutableArray alloc] init];
    [super viewDidLoad];
    [self fetchTweets];

我的JSON 解析器工作正常:

- (void)fetchTweets 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue,  ^
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://myselection.gr/support3/frontistiria_project/android_data.php/?type=publicNews"]];

        [self performSelectorOnMainThread:@selector(fetchedForecast:)withObject:data waitUntilDone:YES];
    );


- (void)fetchedForecast:(NSData *)responseData 
    NSError *error;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    NSLog(@"Rows %@", [json objectForKey:@"total_rows"]);
    NSArray *items = [json valueForKeyPath:@"content"];

    NSEnumerator *enumerator = [items objectEnumerator];
    titlosjson.text=[[items objectAtIndex:1] objectForKey:@"title"];
    Keimenojson.text=[[items objectAtIndex:1] objectForKey:@"descr"];

    while (item = (NSDictionary*)[enumerator nextObject]) 
        [TitlosArray addObject:[item objectForKey:@"title"]];
        [KeimenoArray addObject:[item objectForKey:@"descr"]];
        NSLog(@"Title = %@", [item objectForKey:@"title"]);
        NSLog(@"Descr = %@",[item objectForKey:@"descr"]);
    

    NSLog(@"%@",[TitlosArray objectAtIndex: 1]);
    myArray = [NSArray arrayWithArray:TitlosArray ];
    NSLog(@"%@", [myArray objectAtIndex: 2]);

但我的UITableView 有问题:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return myArray.count;


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

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

    //cell.textLabel.text = [NSString stringWithFormat:@"by %@", text];
    return cell;

【问题讨论】:

您好,欢迎您。您将需要添加更多关于什么有效和什么无效的详细信息。 是什么问题?抱歉,“我有问题”不足以帮助您。 我的 json 完美运行。我将数据存储在 MutableArray 中。当我尝试在我的 tableView 中添加我的数组时,我从不显示它们。我想在 tableView 中添加“TitlosArray”。最终程序完美无误:( 检查 rdurands 的答案并将[self.tableview reloadData]; 添加为-(void)fetchedForecast:(NSData *)responseData 的最后一行 并确保您的 viewController 设置为您的表的委托和数据源。 代理和数据源在 Storyboard 上还可以 【参考方案1】:

您正在创建空单元格,因此您的内容将不会显示。

尝试用这个替换你的 cellForRowAtIndexPath: 方法:

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

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

    cell.textLabel.text = [TitlosArray objectAtIndex:indexPath.row];

    return cell;

【讨论】:

【参考方案2】:

这行得通,经过测试。

由示例单视图应用程序制成,在 IB 中添加了 tableView(并连接到 IBOutlet

#import "ViewController.h"

@interface ViewController ()

    NSMutableArray *titlosArray;
    NSMutableArray *keimenoArray;


@property (strong) IBOutlet UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];

    self.tableView.delegate = self;
    self.tableView.dataSource = self;

    titlosArray = [[NSMutableArray alloc] init];
    keimenoArray = [[NSMutableArray alloc] init];
    [super viewDidLoad];
    [self fetchTweets];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


- (void)fetchTweets

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue,  ^
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://myselection.gr/support3/frontistiria_project/android_data.php/?type=publicNews"]];

        [self performSelectorOnMainThread:@selector(fetchedForecast:)withObject:data waitUntilDone:YES];
    );


- (void)fetchedForecast:(NSData *)responseData

    NSError *error;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    NSLog(@"Rows %@", [json objectForKey:@"total_rows"]);

    NSArray *items = [json valueForKeyPath:@"content"];

    //clear the arrays (if you're planning to download data more then once - refreshing...)

    [titlosArray removeAllObjects];
    [keimenoArray removeAllObjects];

    for (NSDictionary *item in items)
    
        [titlosArray addObject:[item objectForKey:@"title"]];
        [keimenoArray addObject:[item objectForKey:@"descr"]];
    

    //once you updated youd data-model you have to reload it
    [self.tableView reloadData];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    return titlosArray.count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"TweetCell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    

    cell.textLabel.text = (NSString *)[titlosArray objectAtIndex:indexPath.row];

    return cell;


@end

编辑:

如果您还想查看字幕中的详细信息,可以将cellForRowAtIndexPath: 更改为:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"TweetCell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    

    cell.textLabel.text = (NSString *)[titlosArray objectAtIndex:indexPath.row];

    cell.detailTextLabel.text=(NSString *)[keimenoArray objectAtIndex:indexPath.row];

    return cell;

请注意,如果您想显示完整的文本(因为您的查询返回每条记录的大量文本),您将不得不摆弄自定义 UITableViewCell 实现。

您可能会觉得本教程很有趣:Table View Animations and Gestures

【讨论】:

不客气!如果您遇到任何问题,请给我留言。 我还有 1 个问题。我正在尝试将我在 Storyboard 上的表格添加到 Custom 的字幕。我添加代码: cell.detailTextLabel.text=(NSString *)[keimenoArray objectAtIndex:indexPath.row];我看不到 Subtible。 谢谢:P。让我们制作完整的教程 ImageView..:P【参考方案3】:

我在这里修改你的代码,(希望你不会介意)尝试用这个替换你的代码:

- (void)fetchedForecast:(NSData *)responseData 
    NSError *error;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    NSLog(@"Rows %@", [json objectForKey:@"total_rows"]);
    NSArray *items = [json valueForKeyPath:@"content"];

    NSEnumerator *enumerator = [items objectEnumerator];
    titlosjson.text=[[items objectAtIndex:1] objectForKey:@"title"];
    Keimenojson.text=[[items objectAtIndex:1] objectForKey:@"descr"];
    myArray = [[NSMutableArray alloc] initWithCapacity:0];
    while (NSDictionary *item = (NSDictionary*)[enumerator nextObject]) 
        NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [item objectForKey:@"title"], @"title",
                                    [item objectForKey:@"descr"], @"descr", nil];
        [myArray addObject:dictionary];
    

//But I have problem with my UITableView:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return myArray.count;


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

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    
    NSArray *myArray;
    cell.textLabel.text = [[myArray objectAtIndex:indexPath.row] valueForKey:@"title"];
    cell.detailTextLabel.text = [[myArray objectAtIndex:indexPath.row] valueForKey:@"descr"];

    return cell;

以下是要点:

在您的cellForRowAtIndexPath 方法中,您没有为titleLabel 设置任何值 我已将您的cellStyle 设置为UITableViewCellStyleSubtitle,这将能够设置详细说明(如果您不喜欢,可以更改) 最后,我没有使用两个不同的数组,而是使用了您的 myArray(使其可变)并在其中添加了字典,然后在为单元格设置值时使用这些值。

【讨论】:

while (item = (NSDictionary*)[enumerator nextObject]) NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: [item objectForKey:@"title"], @"title", [item objectForKey:@ “描述”],@“描述”,无]; [myArray addObject:字典]; NSLog(@"%@" ,myArray[0]);问题在这里。我所有的结果都在 myArray Table 的第 0 行 你的意思是,你没有得到任何记录?

以上是关于在 UITableView 中显示 Json 结果的主要内容,如果未能解决你的问题,请参考以下文章

JSON 数据未显示在 UITableView 上

如何使用 JSON 数据填充 UITableView?

在 UITableView 中显示 JSON 数据

在 UITableView 中正确显示 JSON 数据

在 UITableView 中显示来自 JSON 的数据

如何在 UITableView 中显示 JSON 数据