L'interface user du viewcontroller modal ne répond pas après presentViewController: animated: completion:

Mon application a un viewcontroller racine, qui au début de l'application affiche

  • connection viewController view si l'user n'est pas connecté
  • Vue principale viewController si l'user est connecté

Code AppDelegate:

- (BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions { self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; self.window.rootViewController = [[RootViewController alloc] init]; [self.window makeKeyAndVisible]; return YES; } 

Voici le code utilisé dans RootViewController:

 @implementation RootViewController - (void) loadView { [super loadView]; // here mainViewController and loginNavigationController are initialized } ... - (UIView*) view { [super view]; // this invokes loadView return self.isLoggedIn ? self.mainViewController.view : self.loginNavigationController.view; } .... - (void) userDidLogin { [self.loginNavigationController presentViewController: self.mainViewController animated: YES completion: nil]; } @end 

Si l'user n'est pas connecté et appuie sur le button de connection, le viewController principal est présenté.

Le problème est qu'après la présentation de viewController, je ne peux pas interagir avec les éléments de l'interface user. Par exemple, j'ai une tableView comme sous-vue principale viewController et quand j'essaye de le faire défiler, je reçois l'avertissement suivant dans le panneau de debugging:

  <UITableView: 0x202a4000; frame = (0 0; 310 548); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x1fd9f570>; layer = <CALayer: 0x1fdccff0>; contentOffset: {0, 0}>'s window is not equal to <RootViewController: 0x1fd9f7d0>'s view's window! 

Ok, donc après avoir regardé le code mis à jour, je vois que vous avez un rootViewController et donne dynamicment la vue qui devrait être présentée. Le fait est que rootViewController est en charge de la vue racine tandis que vos deux autres controllers de vue gèrent leurs propres vues. Vous ne devez pas passer la vue d'un controller de vue différent.

Donc, à la fin, on dirait que vous voulez conditionnellement votre rootviewcontroller. Alors regardons le délégué de l'application. Je pense que vous devriez requestr à votre application de faire quelque chose comme ça. Avoir compris à l'exécution quel viewcontroller présenter. Ensuite, faites le rootviewcontroller pour l'application.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIViewController * resolvedRootViewController = [self someMethodThatCorrectlyGivesRootViewController]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = resolvedRootViewController; [self.window makeKeyAndVisible]; return YES; }