2009-06-28 3 views
0

J'ai une instance de UIViewController affichant une liste d'éléments. Lorsque l'utilisateur sélectionne un élément, j'ai besoin de créer une nouvelle instance de UIViewController (peuplée par une liste d'éléments différente) et de l'afficher. Au moment où je vous appelle le constructeur à partir de la méthode didSelectRowAtIndexPathInstancier une nouvelle instance de UIViewController en lui-même

RootViewController *rootViewController = [[RootViewController alloc]initWithStyle:UITableViewStylePlain]; 
UIViewController *targetViewController = rootViewController; 
[[self navigationController] pushViewController:targetViewController animated:NO]; 

Mais au lieu de créer un nouvel objet, il réutilise l'actuel: la nouvelle vue contient des éléments de la nouvelle liste, ainsi que de la précédente liste. Alors, comment créer une nouvelle instance de RootViewController à partir de lui-même?

Répondre

0

Vous créez et présentez un nouveau contrôleur de vue, votre problème est ailleurs.

Où conservez-vous les données pour la table?

Votre code crée une nouvelle instance, mais il est très révélateur qu'après la création, vous n'indiquiez pas au nouveau contrôleur d'affichage ce qu'il doit afficher - cela signifie que vous obtenez les données d'une source plus globale, que vous devez simplement ajouté les nouvelles données sur.

+0

Les données sont un fichier xml. J'appelle une méthode pour analyser le xml et remplir la liste. En fonction de la valeur des arguments, je charge différentes listes XML. Mais les anciens restent ... hmm ... – Pavel

0

vraiment vaguement:

1) importer votre fichier d'en-tête de 2ème niveau dans ce fichier de mise en œuvre. De retour au 2e niveau, avoir des getters/setters. Dans votre 1er niveau, ajoutez une autre méthode, - (BOOL) set2ndLevelDataBasedOnXMLSource: (id) source dans cette méthode définir les variables d'instance appropriées et faire des calculs pour définir les données.

2) Votre code didSelectRow devrait ressembler à:

if(!rootViewController) { 
RootView *rootViewController = [[RootView alloc] initWithstyel...]; } 

BOOL result = [self set2ndLevelDataBasedOnXMLSource:_Source_]; 

if(result) { 
[[self navigationController] pushViewController:targetViewController animated:NO]; } 

Ensuite, vous pouvez refactoriser:

if([self set2ndLevelDataBasedOnXMLSource:_Source_]) { 
[[self navigationController] pushViewController:targetViewController animated:NO]; } 

3) en - (BOOL) set2ndLevelDataBasedOnXMLSource: (id) la source {

J'ai:

NSUInteger result; 
if(source == true) { 

2ndLevelController.section1data = [source (parse for)...]; 

2ndLevelController.section2data = [source (parse for ...)]; 

... 

result = 1; } 
else { result = 0; } 

return result; 

4) dans mon 2ème niveau, sous viewWillDisappear, je mets toutes ces variables d'instance à zéro (ce sont des tableaux mutables)

C'est comme ça que je l'ai fait.