2010-04-10 18 views
1

J'ai un UINavigationController avec lequel l'utilisateur navigue. En poussant un UIViewController spécifique sur la pile de navigation, un bouton "settings" apparaît dans la barre de navigation. Lorsque l'utilisateur clique sur ce bouton, je souhaite retourner la vue/le contrôleur en cours, c'est-à-dire tout ce qui apparaît à l'écran, y compris la barre de navigation, dans une vue des paramètres.UIViewAnimation effectuée par un UIViewController appartenant à un UINavigationController?

J'ai donc un SettingsViewController que je voudrais utiliser depuis mon CurrentViewController qui réside dans une pile de navigationController.

Je reçois toutes sortes de comportements étranges en essayant de faire cela, les UIViews appartenant au SettingsViewController commenceront à s'animer, à glisser en place, les boutons de navigation se déplacer, rien ne se passe comme je le pense.

-(void)settingsHandler { 

    SettingViewController *settingsView = [[SettingViewController alloc] init]; 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight 
          forView:self.navigationController.view 
          cache:YES]; 

    [self.navigationController.view addSubview:settingsView.view]; 

    [UIView commitAnimations]; 

} 

Les résultats ci-dessus dans les vues feuilletant correctement, mais les sous-vues du SettingsViewController sont tous positionnés dans (0, 0) et après la transition, ils « déclic » en place?

Est-ce parce que j'instancie et ajoute mes sous-vues dans viewDidLoad, comme ça?

- (void)viewDidLoad { 

    UIImageView *imageBg = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)]; 
    [imageBg setImage:[UIImage imageNamed:@"background.png"]]; 
    [self.view addSubview:imageBg]; 
    [imageBg release]; 

    SettingsSubview *switchView = [[SettingsSubview alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)]; 
    [self.view addSubview:switchView]; 
    [switchView release]; 
    [super viewDidLoad]; 
} 

1: Comment dois-je faire correctement la transition « flip », à partir du UIViewController dans le UINavigationController, à une nouvelle UIViewController et par la suite de la nouvelle UIViewController et retour à l ' « original » UIViewController résidant sur la pile UINavigationControllers? 2: Dois-je utiliser une approche différente de la méthode "viewDidLoad" lors de l'instanciation et de l'ajout de sous-vues à un UIViewController?

-question 2 est plus une «meilleure pratique» chose. J'ai vu différentes façons de le faire et j'ai du mal à trouver ou à comprendre la documentation du cycle de vie et les différents sujets et messages sur le sujet. Il me manque les exemples de «meilleures pratiques».

Merci beaucoup pour toute aide donnée :)

Répondre

3

Si vous voulez créer votre vue hiérarchique programme, l'endroit pour le faire est en -loadView. Pour ce faire, vous devez créer la vue vous-même, ajouter tous ses sous-vues, puis l'assigner à la propriété de vue, comme ceci:

- (void)loadView { 
    UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)]; 

    UIImageView *imageBg = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)]; 
    [imageBg setImage:[UIImage imageNamed:@"background.png"]]; 
    [containerView addSubview:imageBg]; 
    [imageBg release]; 

    SettingsSubview *switchView = [[SettingsSubview alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)]; 
    [containerView addSubview:switchView]; 
    [switchView release]; 

    self.view = containerView; 
    [containerView release]; 
} 

Il aide à comprendre le contexte dans lequel cette méthode est appelée, et comment il se comporte par défaut. La première fois que vous accédez à la propriété view d'un UIViewController, la méthode getter par défaut appelle -loadView à lazy-load la vue. L'implémentation par défaut de -loadView charge la vue à partir d'une plume si celle-ci a été spécifiée. Sinon, il crée un objet UIView simple et le définit comme vue du contrôleur. En remplaçant cette méthode, vous pouvez vous assurer que la hiérarchie de votre vue sera entièrement formée la première fois que vous y accéderez. -viewDidLoad doit être utilisé pour toute configuration ultérieure qui doit avoir lieu après le chargement complet de la hiérarchie de vues. Cette méthode sera appelée si la vue est chargée à partir d'une plume ou construite par programme dans loadView.

+0

Merci cduhn. C'était une très bonne explication et un parfait exemple. – RickiG