Question

En bref: Je veux avoir deux points de vue plein écran, où je peux basculer entre la vue A et vue B. Je sais que je pouvais utiliser un contrôleur barre d'onglets, mais je ne veux pas. Je veux voir comment cela se fait à la main, pour apprendre ce qui se passe sous le capot.

J'ai un UIViewController qui agit comme un contrôleur racine:

@interface MyRootController : UIViewController {
    IBOutlet UIView *contentView;
}
@property(nonatomic, retain) UIView *contentView;

@end

Le contentView est relié à un UIView que j'ajouté en tant que sous-vue à la « vue » du Nib. Cela a la couleur verte et je le vois plein écran. Fonctionne très bien.

Ensuite, j'ai créé deux autres contrôleurs Voir à peu près de la même façon. ViewControllerA et ViewControllerB. ViewControllerA a un fond bleu, ViewControllerB a un fond noir. Juste pour voir que l'on est actif.

Ainsi, dans la mise en œuvre de myRootController, je fais ceci:

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    ViewControllerA *vcA = [[ViewControllerA alloc] initWithNib];
    [self.contentView addSubview:vcA.view];

    [cvA release];
}

Par ailleurs, la méthode -initWithNib ressemble à ceci:

- (id)initWithNib { // Load the view nib
    if (self = [super initWithNibName:@"ViewA" bundle:nil]) {
        // do ivar initialization here, if needed
    }
    return self;
}

Cela fonctionne. Je vois la vue de ViewControllerA quand je commence l'application. Mais maintenant, la grande question est la suivante: A View Controller a généralement toutes ces méthodes comme:

  • (void) viewWillAppear: (booléen) animée;
  • (void) viewDidDisappear: (booléen) animée;
  • (void) viewDidLoad;

... et ainsi de suite. Qui ou quoi, ou comment ces méthodes seraient appelés si je le fais « mon » chemin sans un contrôleur de barre d'onglets? Je veux dire: Si je que la classe allouer de ViewController et la vue get visible, ce que je dois prendre soin à appeler ces méthodes? Comment sait-il que viewWillAppear, viewDidDisappear ou viewDidLoad? Je crois que le contrôleur de la barre d'onglets a tout cela « intelligence » sous le capot. Ou je me trompe?

Mise à jour: Je l'ai testé. Si je le contrôleur libère vue (par exemple: ViewControllerA), je vais obtenir aucun message de journal sur viewDidDisappear. Seulement lors de l'allocation et l'initialisation du ViewControllerA, je reçois un viewDidLoad. Mais c'est tout. Donc, tous les signes pour se l'intelligence de UITabBarController maintenant,?) Et je dois comprendre comment répliquer que, à droite

Était-ce utile?

La solution

Vous pouvez commencer par le plus simple removeFromSuperview / insertSubview et ajouter du code à peu à peu.


//SwitchViewController.h
#import 
@class BlueViewController;
@class YellowViewController;

@interface SwitchViewController : UIViewController {
    IBOutlet BlueViewController *blueViewController;
    IBOutlet YellowViewController *yellowViewController;
}
- (IBAction)switchViews:(id)sender;
@property (nonatomic, retain) BlueViewController *blueViewController;
@property (nonatomic, retain) YellowViewController *yellowViewController;
@end

//1. remove yellow view and insert blue view
- (IBAction)switchViews:(id)sender {
    if(self.blueViewController.view.superview == nil)
    {
        [yellowViewController.view removeFromSuperview];
        [self.view insertSubview:blueViewController.view atIndex:0];
    }
}

//2. appear=insert, disappear=remove
if(blueViewController.view.superview == nil)
{
    [blueViewController viewWillAppear:YES];
    [yellowViewController viewWillDisappear:YES];

    [yellowViewController.view removeFromSuperview];
    [self.view insertSubview:self.blueViewController.view atIndex:0];

    [yellowViewController viewDidDisappear:YES];
    [blueViewController viewDidAppear:YES];
}

//3. now add animation
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//blue view will appear by flipping from right
if(blueViewController.view.superview == nil)
{
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight 
                            forView:self.view cache:YES];

    [blueViewController viewWillAppear:YES];
    [yellowViewController viewWillDisappear:YES];

    [yellowViewController.view removeFromSuperview];
    [self.view insertSubview:self.blueViewController.view atIndex:0];

    [yellowViewController viewDidDisappear:YES];
    [blueViewController viewDidAppear:YES];
}
[UIView commitAnimations];

Autres conseils

Il y a un bel exemple de passer des vues au chapitre 6 de commencer le développement iPhone. Vous pouvez voir le code source ici: http://iphonedevbook.com/

SwitchViewController a le code pour changer de vue programatically.


- (IBAction)switchViews:(id)sender
{

    if (self.yellowViewController == nil)
    {
        YellowViewController *yellowController = [[YellowViewController alloc]
                initWithNibName:@"YellowView" bundle:nil];
        self.yellowViewController = yellowController;
        [yellowController release];
    }

    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:1.25];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    UIViewController *coming = nil;
    UIViewController *going = nil;
    UIViewAnimationTransition transition;

    if (self.blueViewController.view.superview == nil) 
    {   
        coming = blueViewController;
        going = yellowViewController;
        transition = UIViewAnimationTransitionFlipFromLeft;
    }
    else
    {
        coming = yellowViewController;
        going = blueViewController;
        transition = UIViewAnimationTransitionFlipFromRight;
    }

    [UIView setAnimationTransition: transition forView:self.view cache:YES];
    [coming viewWillAppear:YES];
    [going viewWillDisappear:YES];
    [going.view removeFromSuperview];
    [self.view insertSubview: coming.view atIndex:0];
    [going viewDidDisappear:YES];
    [coming viewDidAppear:YES];

    [UIView commitAnimations];

}

Si je comprends bien, ce que vous essayez d'accomplir est assez simple.

Il suffit d'ajouter un UINavigationController sur votre délégué de l'application et à faire:

[navigationController pushView:vcA];

Les délégués seront appelés en conséquence:

  • (void) viewWillAppear: (booléen) animée;
  • (void) viewDidDisappear: (booléen) animée;
  • (void) viewDidLoad;

Et quand vous voulez pop la vue et pousser les uns les autres:

[navigationController popViewControllerAnimated:true];
[navigationController pushView:vcB];

Si vous ne voulez pas l'NavigationController montrant simplement utiliser:

[navigationBar setHidden:YES];

Où navigationBar est le UINavigationBar correspondant à votre UINavigationController.

Cela peut être un vieux problème, mais je suis récemment tombé sur le même problème et a eu du mal à trouver quelque chose qui fonctionnait. Je voulais passer entre deux contrôleurs de vue complémentaires, mais je voulais que le passage à être animé (construit dans les animations fonctionnent très bien), et je voulais que ce soit compatible avec storyboards si possible.

Pour tirer profit de la transition intégrée, de UIView +transitionFromView:toView:duration:options:completion: méthode fonctionne à merveille. Mais, il ne les transitions entre les vues, pas voir les contrôleurs.

Pour que la transition soit entre entiers contrôleurs de vue, non seulement des vues, la création d'un UIStoryboardSegue personnalisé est le chemin à parcourir. Cette approche vous permet d'encapsuler Que vous utilisiez storyboards, ou non toute la transition et de gérer la transmission d'informations pertinentes d'un contrôleur de vue à l'autre. Il ne concerne que UIStoryboardSegue et le sous-classement remplaçant une seule méthode, -perform.

Pour une implémentation de référence, voir RAFlipReplaceSegue , l'enchaînement exact personnalisé Je mets ensemble à l'aide de cette approche. En prime, il remplace également l'ancien contrôleur de vue avec le nouveau si elle est dans une pile de UINavigationController.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top