2010-12-10 67 views
0

我正在研究Objective-C中的第一个JSON示例,并且遇到了我试图重现的this伟大教程。在此过程中,我决定将JSON返回到我已经工作的tableView中(只是为了确保我可以在视图中执行某些操作)。你可以在“connectionDidFinishLoading”中设置tableView数据源的值吗?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    responseData = [[NSMutableData data] retain]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.unpossible.com/misc/lucky_numbers.json"]]; 
    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [connection release]; 

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    [responseData release]; 

    NSArray *luckyNumbers = [responseString JSONValue]; 

    NSMutableString *text = [NSMutableString stringWithString:@"Nums "]; 

    for (int i = 0; i < [luckyNumbers count]; i++) 
     [text appendFormat:@"%@", [luckyNumbers objectAtIndex:i]]; 

    self.movies = [[NSArray alloc] initWithObjects:@"First", text, @"Last", nil]; 
} 

什么我发现是,当我在“connectionDidFinishLoading”设置数组它显示为没有在运行的应用程序 - 但如果我直接在“viewDidLoad中”方法与3个简单的字符串值设置此它显示很好。

当我调试运行的应用程序时,我看到JSON响应和字符串看起来有效(没有问题,我可以看到)。

在这个“connectionDidFinishLoading”方法之前,我的tableView的数据源是否已经设置好了,或者我错过了什么?

回答

0

我最初的问题是该解决方案解决:

在我的“connectionDidFinishLoading”的方法结束时,我呼吁的appDelegate的方法叫做“jsonFinished”。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    //do all the json work and set the array that I'm using as my datasource 

    self.movies = [[NSArray alloc] initWithObjects:@"First", "Last", nil]; 

    [appDelegate jsonFinished]; //have the app delegate do the refresh call back 
} 

随后的appDelegate里面我只是提供了该做的UITableView的

- (void)jsonFinished 
{ 
    moviesController.refreshDisplay; 
} 

刷新并在“refreshDisplay”的方法我做reloadData上的tableView的“jsonFinished”方法的实现

- (void)refreshDisplay 
{ 
    [moviesTableView reloadData]; 
} 

现在后的数据被加载的appDelegate打完重新加载为的tableView

的数据的方法
2

您的UITableView将首先调用其DataSource数据一次,推测在viewDidLoad之后的某个时间。在第一次加载后,它只会根据需要请求数据(即当您滚动到不同的单元格时)。如果您希望在数据准备就绪时(例如在收到URL数据后)刷新其内容,请致电[tableView reloadData]

相关问题