web-dev-qa-db-fra.com

iOS 7 - Obtention d'un message d'avertissement lors de la présentation du contrôleur de vue modale

Compilation et exécution sous iOS 7 - Je reçois un message d'avertissement: "La présentation de contrôleurs de vue sur des contrôleurs de vue détachés est déconseillée" lors de la présentation du contrôleur de vue modal. Je n'ai jamais eu de problème avec iOS 6 ou version antérieure. Quelqu'un peut-il indiquer si quelque chose a changé lors de la présentation du contrôleur de vue modale?

SearchViewController *controller1;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController-iPad" bundle:nil];
}
else
{
   controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
}
controller1.delegate = self;
[[self navigationController] presentModalViewController:controller1 animated:YES];

* EDIT * Voici le code Quelqu'un peut-il indiquer où il est imbriqué . On dirait qu'ils sont imbriqués, Merci de suggérer comment lier à l'aide du modèle enfant Viewcontroller.

(void)applicationDidFinishLaunching:(UIApplication *)application
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController-iPad" bundle:nil];
    }
    else
    {
       self.loginRootviewController =   [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    }

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.loginRootviewController];


    DDMenuController *rootController = [[DDMenuController alloc] initWithRootViewController:navController];
    _menuController = rootController;



    AppMainMenuViewController *leftController = [[AppMainMenuViewController alloc] init];
    rootController.leftViewController = leftController;
    self.loginRootviewController.delegateLogin = leftController;

    self.window.rootViewController = rootController;

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

}
23
Ram G.

Un contrôleur de vue est détaché si le story-board n'a pas connaissance de séquences qui le relient de quelque manière que ce soit au contrôleur de vue racine.

Il est suggéré de créer une séquence via Interface Builder et de l'appeler dans le code, même pour une vue modale, si vous utilisez un storyboard.

Même avec XCode 4.6.x et iOS 6.x, vous aviez des avertissements au moment de la construction à propos des contrôleurs de vue non attachés.

Si vous avez deux story-boards (un pour iPhone et un pour iPad), vous pouvez nommer le même titre pour chacun. Les identifiants Segue doivent être uniques par storyboard. Ainsi, si vous effectuez une transition ( performSegueWithIdentifier ) avec le même identifiant, vous pourrez vous rendre à un endroit sur l'iPhone et à un autre sur l'iPad.

18
Marcus Adams

Cet avertissement survient normalement lorsque nous essayons de présenter un contrôleur de vue de manière modale dans un autre contrôleur de vue qui ne fait pas partie de rootViewController, et nous ajoutons simplementSubview la vue du contrôleur de vue. 

A ce stade, nous devrions appeler presentViewController dans ce contrôleur de vue qui fait partie de rootViewController.

Nous pouvons donc présenter directement tout contrôleur de vue dans rootViewController

UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
[vc presentViewController:obj animated:YES completion:nil];
[vc dismissViewControllerAnimated:YES completion:nil];
18
Teena nath Paul

J'ai eu le même problème, et moi aussi je n'utilisais PAS de scénarimage (je travaille sur un projet de trois ans).

Dans mon cas, la cause était que je n'avais pas assigné le rootViewController de mon application à la fenêtre, comme ceci:

- (BOOL)application:didFinishLaunchingWithOptions:
{
    ...
    self.window.rootViewController = myRootViewController; // I was missing this
    ...
}

Plus d'avertissements maintenant.

18
Riccardo Tesio

Pour ceux qui utilisent DDMenuViewController, cette solution est simple. Ajoutez simplement [self addChildViewController:controller]; à initWithRootViewController, et à setRightViewController et setLeftViewController.

7
bmueller

Pour éviter l’avertissement dans une navigation Push, vous pouvez directement utiliser:

[self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil];

Et ensuite, dans votre contrôleur de vue modale, lorsque tout est terminé, vous pouvez simplement appeler: 

[self dismissViewControllerAnimated:YES completion:nil];

4
cdescours

Si vous utilisez le storyboard et obtenez cette erreur, cela peut se produire si vous essayez de présenter automatiquement une vue de viewDidLoad trop rapidement. Si vous appelez votre segment modal après un court laps de temps, cela fonctionne sans autre avertissement.

2
AndyDunn

Ce message peut toujours apparaître lorsque vous avez des contrôleurs de vue imbriqués . Si tel est le cas, assurez-vous qu'ils sont liés à l'aide du modèle de contrôleur de vue enfant.

2
berbie

Appel de [self presentViewController: vc animated: NO complétion: nil]; in viewDidAppear a résolu le problème pour moi.

1
oyvindhauge

J'ai constaté que, si vous utilisez un storyboard, vous voudrez mettre le code qui présente le nouveau contrôleur de vue dans viewDidAppear. Il supprimera également l'avertissement "Appels non équilibrés pour commencer/terminer les transitions d'apparence pour ...".

0
Dan Levy

J'ai eu le même problème. Mais plutôt que ce soit la façon dont j'ai démarré la vue, c'est la configuration de la vue. J'avais accidentellement défini la classe de la vue sur la classe du contrôleur de vue plutôt que sur le propriétaire des fichiers. L'indice était qu'il affichait la vue, mais une partie du style manquait. La chose étrange est que cela fonctionnait sur les anciennes versions d'iOS.

0
Clive Jefferies