2010-03-26 7 views
1

Je suis juste en train d'essayer de me tourner vers une simple vue de commutation pour l'iPhone et j'ai créé une application simple pour essayer de m'aider à le comprendre.iPhone Voir basiques de commutation

J'ai inclus le code de mon contrôleur racine utilisé pour changer les vues. Mon application dispose d'une barre d'outils unique avec trois boutons chacun reliant à une vue. Voici mon code pour le faire, mais je pense qu'il y a un moyen plus efficace d'y parvenir? Existe-t-il un moyen de trouver/supprimer la vue affichée au lieu d'avoir à faire les instructions if pour voir si l'une ou l'autre a une superclasse?

Je sais que je pourrais utiliser une barre d'onglets pour créer un effet similaire, mais j'utilise cette méthode pour m'aider à pratiquer quelques-unes des techniques.

-(IBAction)switchToDataInput:(id)sender{ 
if (self.dataInputVC.view.superview == nil) { 
    if (dataInputVC == nil) { 
    dataInputVC = [[DataInputViewController alloc] initWithNibName:@"DataInput" bundle:nil]; 
    } 
    if (self.UIElementsVC.view.superview != nil) { 
    [UIElementsVC.view removeFromSuperview]; 
    } else if (self.totalsVC.view.superview != nil) { 
    [totalsVC.view removeFromSuperview]; 
    } 

    [self.view insertSubview:dataInputVC.view atIndex:0]; 
} 
} 

-(IBAction)switchToUIElements:(id)sender{ 
if (self.UIElementsVC.view.superview == nil) { 
    if (UIElementsVC == nil) { 
    UIElementsVC = [[UIElementsViewController alloc] initWithNibName:@"UIElements" bundle:nil]; 
    } 
    if (self.dataInputVC.view.superview != nil) { 
    [dataInputVC.view removeFromSuperview]; 
    } else if (self.totalsVC.view.superview != nil) { 
    [totalsVC.view removeFromSuperview]; 
    } 

    [self.view insertSubview:UIElementsVC.view atIndex:0]; 
} 

} 

-(IBAction)switchToTotals:(id)sender{ 
if (self.totalsVC.view.superview == nil) { 
    if (totalsVC == nil) { 
    totalsVC = [[TotalsViewController alloc] initWithNibName:@"Totals" bundle:nil]; 
    } 
    if (self.dataInputVC.view.superview != nil) { 
    [dataInputVC.view removeFromSuperview]; 
    } else if (self.UIElementsVC.view.superview != nil) { 
    [UIElementsVC.view removeFromSuperview]; 
    } 

    [self.view insertSubview:totalsVC.view atIndex:0]; 
} 
} 

Répondre

1

Je ne recommanderais pas Recréant chaque vue chaque fois que vous voulez afficher, mais simplement apporter la sous-vue correcte à l'avant lorsque cela est nécessaire. Quelque chose comme:

-(void)init{ 
    // The 3 view controllers below are ivars, so we can access in other methods 
    dataInputVC = [[DataInputViewController alloc] initWithNibName:@"DataInput" bundle:nil]; 
    UIElementsVC = [[UIElementsViewController alloc] initWithNibName:@"UIElements" bundle:nil]; 
    totalsVC = [[TotalsViewController alloc] initWithNibName:@"Totals" bundle:nil]; 

    // Add as subviews (rearrange so that correct view appears first) 
    [self.view addSubview:dataInputVC.view]; 
    [self.view addSubview:UIElementsVC.view]; 
    [self.view addSubview:totalsVC.view]; 
} 

-(IBAction)switchToDataInput:(id)sender{ 
    [self.view bringSubviewToFront:dataInputVC.view]; 
} 

-(IBAction)switchToUIElements:(id)sender{ 
    [self.view bringSubviewToFront:UIElementsVC.view]; 
} 

-(IBAction)switchToTotals:(id)sender{ 
    [self.view bringSubviewToFront:totalsVC.view]; 
} 
+0

Merci pour la réponse. Je pense que l'instruction if devrait empêcher la création de la vue à chaque fois, mais seulement quand elle n'existe pas déjà. Comme j'ai inclus dans le didReceiveMemoryWarning une section de code qui va supprimer les vues inactives, si cela devait arriver, une nouvelle vue devrait être créée et aussi une forme de chargement paresseux si l'utilisateur ne clique jamais sur l'une des vues alors il ne sera jamais chargé. Est-ce que ça marche? J'aime ce que vous avez fait là-bas, c'est beaucoup plus propre mais cela n'entraînerait-il pas une pénalité de mémoire si les trois vues étaient chargées en même temps? Merci –

+0

Si vous voulez que votre code fonctionne avec le didReceiveMemoryWarning, incluez votre code de chargement paresseux dans chacune des actions IB, plutôt que dans une méthode init comme je l'ai fait. La chose qui est laide à propos de votre code sont les appels removeFromSuperview – pheelicks

1

Ne pas réinventé UITabBarController. Vissez la barre d'outils et remplacez-la par une barre d'onglets, puis tout ce comportement sera intégré pour vous. Cela devrait être beaucoup plus facile! Tiens-moi au courant de ce que ça devient.

+0

Salut Jonathan, Merci pour la réponse, je comprends que je pourrais utiliser UITabBarController pour faire exactement cela! La raison pour laquelle je ne le suis pas est que je l'utilise comme un processus d'apprentissage pour m'aider à utiliser les vues et que l'utilisation d'une barre d'outils est un moyen rapide et efficace de créer trois boutons pour passer à trois vues différentes. moi-même afin que je puisse apprendre de lui. Merci –