0

我必须在 iPhone 应用程序的标签栏控制器中添加一个标签,其中包含显示 JSON 数据的表格视图。

我的问题是现在我看到表格视图但没有数据。这是我的代码:

.h 文件

#import <UIKit/UIKit.h>

@interface FourthViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

    @property (strong, nonatomic) IBOutlet UITableView *myTableView;
    @property (nonatomic, strong) NSArray *tweets;

@end

.m 文件

#import "FourthViewController.h"

@interface FourthViewController ()

@end

@implementation FourthViewController

@synthesize myTableView;
@synthesize tweets;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Issue load request after the view has been loaded.
    [self issueLoadRequest];
}

- (void)viewDidUnload
{
    [self setMyTableView:nil];
    [super viewDidUnload];
}

- (void)issueLoadRequest
{
    // Dispatch this block asynchronosly. The block gets JSON data from the specified URL and performs the proper selector when done.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://api.twitter.com/1/statuses/user_timeline.json?screen_name=jmenter&count=10"]];
        [self performSelectorOnMainThread:@selector(receiveData:) withObject:data waitUntilDone:YES];
    });
}

- (void)receiveData:(NSData *)data {
    // When we have the data, we serialize it into native cocoa objects. (The outermost element from twitter is
    // going to be an array. I JUST KNOW THIS. Reload the tableview once we have the data.
    self.tweets = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    [self.myTableView reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.tweets.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] init];
    // The element in the array is going to be a dictionary. I JUST KNOW THIS. The key for the tweet is "text".
    NSDictionary *tweet = [self.tweets objectAtIndex:indexPath.row];
    cell.textLabel.text = [tweet objectForKey:@"text"];
    cell.textLabel.font = [UIFont boldSystemFontOfSize:11];
    cell.textLabel.numberOfLines = 3;
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Spit out some pretty JSON for the tweet that was tapped. Neato.
    NSString *formattedJSON = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:[self.tweets objectAtIndex:indexPath.row] options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding];
    NSLog(@"tweet:\n%@", formattedJSON);
}


@end

我在这里使用了这个 tut:http: //jeffmenter.wordpress.com/2012/05/30/json-ios-5-go/

4

3 回答 3

0

检查tweet中的objectforkey“text”是否为字符串,如果不是则使用[NSString Stringwithformat:@"%@",[tweet objectForKey:@"text"]];

于 2015-04-23T04:13:37.043 回答
0

按照目前的定义,tweet 是一个 NSArray。您不应该使用objectForKey但使用来访问其成员objectAtIndex:indexPath.row。(在cellForRowAtIndexPath

根据您收到的数据,您可能会为推文选择 NSDictionara。

于 2012-07-13T08:17:04.950 回答
0

您应该在表格视图之外的对象中获取 JSON 数据,而不是将其提取到表格视图cellForRowAtIndexPath方法中,不要直接提取它。因为下载数据需要一些时间,而且连接不良也是一个问题。因此,如果没有下载数据,表格视图将不会显示任何内容。因此,最好下载它并通过添加断点来检查数据是否存在,而不是尝试获取它。

于 2017-06-13T04:51:37.170 回答