2010-12-10 64 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]

相關問題