2010-12-10 5 views
0

Je travaille sur mon premier exemple JSON dans l'objectif-c et j'ai rencontré this un excellent tutoriel que j'essaie de reproduire. En cours de route, j'ai décidé de pousser le JSON retourné dans mon tableView déjà en train de fonctionner (juste pour m'assurer que je pouvais faire quelque chose avec les données dans la vue).Pouvez-vous définir les valeurs de la source de données tableView dans "connectionDidFinishLoading"?

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

Ce que j'ai trouvé est que lorsque je mets le tableau dans « connectionDidFinishLoading » il apparaît comme rien dans l'application en cours d'exécution - méthode encore si je mets ce directement dans le « viewDidLoad » avec 3 valeurs de chaîne simples ça se montre bien.

Lorsque je débogue l'application en cours d'exécution, je vois la réponse JSON et la chaîne semble valide (aucun problème que je peux voir).

Est-ce que la source de données pour ma tableView est déjà définie avant cette méthode "connectionDidFinishLoading" ou est-ce que j'ai manqué quelque chose?

Répondre

0

Ma première question a été résolue par cette solution:

A la fin de ma méthode « connectionDidFinishLoading » J'appelle une méthode sur l'appDelegate appelé « 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 
} 

Puis à l'intérieur du appDelegate Je donne simplement une mise en œuvre de la méthode « jsonFinished » qui fait un rafraîchissement de la UITableView

- (void)jsonFinished 
{ 
    moviesController.refreshDisplay; 
} 

Et dans la méthode « refreshDisplay » Je fais la reloadData sur la tableView

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

Et maintenant après les données sont chargées les feux de appDelegate au large de la méthode qui recharge les données pour tableView

2

Votre UITableView fera appel à ses DataSource pour les données une fois initialement, sans doute après viewDidLoad. Après ce premier chargement, il ne demandera des données que lorsqu'il en a besoin (par exemple lorsque vous faites défiler vers des cellules différentes). Si vous voulez qu'il rafraîchisse son contenu lorsque vos données sont prêtes (comme après avoir reçu vos données URL), appelez le [tableView reloadData].