2010-12-10 16 views
0

Ich arbeite an meinem ersten JSON-Beispiel in objective-c und bin auf this großes Tutorial gestoßen, das ich versuche zu reproduzieren. Entlang des Weges entschied ich mich, den JSON zurück in meine bereits funktionierende TableView zu schieben (nur um sicherzustellen, dass ich etwas mit den Daten in der Ansicht machen konnte).Können Sie die Werte für die Tabellenansichtsdatenquelle in "connectionDidFinishLoading" festlegen?

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

Was ich gefunden habe ist, dass, wenn ich das Array gesetzt in „connectionDidFinishLoading“ es nichts in der laufenden Anwendung erscheint - doch wenn ich setzen Sie diese direkt in der „viewDidLoad“ Methode mit 3 einfachen String-Werte es zeigt sich gut.

Wenn ich die laufende Anwendung debuggen sehe ich die JSON-Antwort und die Zeichenfolge sieht gültig aus (keine Probleme, die ich sehen kann).

Ist die Datenquelle für meine TableView bereits vor dieser Methode "connectionDidFinishLoading" in Stein gemeißelt oder habe ich etwas übersehen?

Antwort

0

Meine erste Frage wurde von dieser Lösung gelöst:

Am Ende meiner „connectionDidFinishLoading“ Methode nenne ich eine Methode auf dem AppDelegate „jsonFinished“ genannt.

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

dann im Inneren des AppDelegate ich einfach eine Implementierung für die „jsonFinished“ Verfahren bereitzustellen, die eine Aktualisierung des UITableView tut

- (void)jsonFinished 
{ 
    moviesController.refreshDisplay; 
} 

Und in der „refreshDisplay“ Methode, die ich die reload tun auf dem Tableview

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

Und nun, nachdem die Daten, um die AppDelegate feuert die Methode geladen, der die Daten für Tableview nachlädt

2

Ihre UITableView wird auf für Daten einmal anfänglich, vermutlich irgendwann nach viewDidLoad aufrufen. Nach dem ersten Laden werden nur Daten angefordert, wenn sie benötigt werden (dh wenn Sie zu verschiedenen Zellen blättern.) Wenn Sie den Inhalt aktualisieren möchten, wenn Ihre Daten bereit sind (etwa nachdem Sie Ihre URL-Daten erhalten haben), Rufen Sie [tableView reloadData].

Verwandte Themen