web-dev-qa-db-fra.com

Appels non équilibrés pour commencer/terminer les transitions d'apparence pour UITabBarController

J'ai un UITabBarController, lors de la première exécution, je veux superposer un contrôleur de vue de connexion mais j'ai reçu une erreur.

Appels non équilibrés pour les transitions d'apparence début/fin pour <UITabBarController: 0x863ae00>.

Ci-dessous le code. 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    // Override point for customization after application launch.

    UIViewController *lessonVC = [[[LessonViewController alloc] initWithNibName:@"LessonViewController" bundle:nil] autorelease];

    UIViewController *programVC = [[[ProgramViewController alloc] initWithNibName:@"ProgramViewController" bundle:nil] autorelease];

    UIViewController *flashcardVC = [[[FlashCardViewController alloc] initWithNibName:@"FlashCardViewController" bundle:nil] autorelease];

    UIViewController *moreVC = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease];

    UINavigationController *lessonNVC = [[[UINavigationController alloc] initWithRootViewController:lessonVC] autorelease];

    UINavigationController *programNVC = [[[UINavigationController alloc] initWithRootViewController:programVC] autorelease];

    UINavigationController *flashcardNVC = [[[UINavigationController alloc] initWithRootViewController:flashcardVC] autorelease];

    UINavigationController *moreNVC = [[[UINavigationController alloc] initWithRootViewController:moreVC] autorelease];

    self.tabBarController = [[[UITabBarController alloc] init/*WithNibName:nil bundle:nil*/] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:lessonNVC, programNVC, flashcardNVC, moreNVC, nil];
    self.tabBarController.selectedIndex = 0;
    self.window.rootViewController = self.tabBarController;

    [self.window makeKeyAndVisible];

    if (![[ZYHttpRequest sharedRequest] userID]) 
    {
        // should register or login firstly
        LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController"
                                                                             bundle:nil];
        loginVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self.tabBarController presentModalViewController:loginVC animated:YES];
        ZY_SAFE_RELEASE(loginVC);
    }

    return YES;
}

Quelqu'un qui peut m'aider? Merci d'avance!

26
ZYiOS

Vous devez attendre pour présenter le contrôleur de vue modale jusqu'à la prochaine boucle d'exécution. J'ai fini par utiliser un bloc (pour simplifier les choses) pour planifier la présentation de la prochaine boucle d'exécution:

Mettre à jour:
Comme mentionné par Mark Amery ci-dessous, un simple dispatch_async fonctionne, aucune minuterie n’est nécessaire:

dispatch_async(dispatch_get_main_queue(), ^(void){     
  [self.container presentModalViewController:nc animated:YES]; 
});

/* Present next run loop. Prevents "unbalanced VC display" warnings. */
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self.container presentModalViewController:nc animated:YES];
});
77
Maurizio

Je soupçonne que le problème est que vous essayez d'appeler presentModalViewController: avant le chargement de la barre de tabulation. Essayez de déplacer la logique finale sur la prochaine boucle d'événement:

  [self.window makeKeyAndVisible];
  [self performSelector:(handleLogin) withObject:nil afterDelay:0];
}

- (void)handleLogin
{
  if (![[ZYHttpRequest sharedRequest] userID]) 
    {
        // should register or login firstly
        LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController"
                                                                             bundle:nil];
        loginVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self.tabBarController presentModalViewController:loginVC animated:YES];
        ZY_SAFE_RELEASE(loginVC);
    }
}
10
Rob Napier
[self.tabBarController presentModalViewController:loginVC animated:**NO**];
5
Rio V

J'ai eu un problème similaire lorsque j'ai essayé de présenter ModalViewController (mon écran d'accueil) dans viewWillAppear de la vue principale. Cela a été résolu simplement en déplaçant l'appel modal VC vers viewDidAppear.

2
Arseniy
[self performSelector:@selector(modaltheView) withObject:self afterDelay:0.1];
-(void)modaltheView
{
    [self.container presentModalViewController:nc animated:YES];
}
0
swamy