2009-09-30 4 views
0

J'ai une tableView avec une liste d'articles. Lorsqu'une sélection est faite, un nouveau contrôleur de vue est poussé sur la pile viewController de navigationController de tableView.Quelle est la bonne façon de créer dynamiquement du contenu pour un UIView?

Ma question est la suivante: l'une des vues dans la hiérarchie de vue associée au contrôleur de vue poussée nécessite l'extraction de données du réseau avant de pouvoir rendre son contenu. Cette extraction est effectuée de manière asynchrone via [NSURLRequest requestWithURL: ...]. Quelle est la bonne façon de transmettre les données à la vue qui en a besoin et que cette vue appelle sa méthode drawRect surchargée? À l'heure actuelle, je fais ceci:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 


    [_connection release]; 
    _connection = nil; 

    [self performSelectorOnMainThread:@selector(GetDataFromCloudAndCreateView) 
         withObject:nil 
        waitUntilDone:NO]; 


} 

Méthode GetDataFromCloudAndCreateView instancie la vue depuis les données. Malheureusement, rien n'est rendu. J'ai essayé [myView setNeedsDisplay] mais cela n'a aucun effet.

Est-ce que quelqu'un pourrait dessiner la bonne façon de faire cela? Merci.

+0

Pouvez-vous afficher la méthode GetDataFromCloudAndCreateView? –

+0

Valerii, GetDataFromCloudAndCreateView instancie une instance d'une sous-classe UIView - avec drawRect substitué qui dépend des données reçues du cloud. Mon défi est de savoir comment informer Cocoa-Touch que je veux que cette sous-classe UIView se rende. Actuellement, cela ne se produit pas malgré [muView setNeedsDisplay] – dugla

Répondre

1

Ce que j'ai fait par le passé dans un cas comme celui-ci est de créer le nouveau UIViewController dans la méthode connectionDidFinishLoading: puis de le pousser. Comme si:

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

    // Code to stop a loading indicator of some kind 

    UIViewController *newView = [[SomeViewController alloc] initWithData:fetchedData]; 
    [self.navigationController pushViewController:newView animated:YES]; 
} 

La méthode initWithData: sur le nouveau contrôleur prend en charge toutes les variables d'exemple, il a besoin basé sur les données que je passais à lui et puis quand la vue des charges, il dessineront la vue en fonction de ces variables.

Hope qui répond à votre question.

+0

Cory, Juste pour que je sois clair, le code ci-dessus fonctionne dans votre tableViewController correct? Donc par exemple dans la méthode tableView: accessoryButtonTappedForRowWithIndexPath: plutôt que de pousser immédiatement le viewController, vous repoussez le push de viewController jusqu'à ce que connectionDidFinishLoading: est appelé? – dugla

+0

Je pense que j'ai une solution qui semble robuste. J'ai pris votre idée de créer les vues dans connectionDidFinishLoading: mais j'ai implémenté connectionDidFinishLoading: dans le viewController poussé. Il est appelé à partir de viewDidAppear: ce qui permet à la hiérarchie de vues préexistante d'être entièrement établie. Ensuite, j'ajoute simplement les sous-vues dans une méthode que j'appelle - sur le thread principal - à partir de connectionDidFinishLoading: Cette approche ressemble moins à la lutte contre Cocoa. Merci pour l'aide. – dugla

Questions connexes