Question

Le principe est très simple. Je veux afficher une vue modale dans une application iPad qui utilise un UISplitViewController

La hiérarchie de la vue est directe:

                                              /- TableViewController1
                     /- root:TabBarController -- TableViewController2
SplitViewController -
                     \- detail:CustomViewController

Lorsque je clique sur l'une des cellules de table dans TableViewController1, j'ouvre une vue modale:

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)ip {
  UIViewController *vc = [[MyModalClass alloc] init];
  UINavigationController *nc = [[UINavigationController alloc]
                                initWithRootViewController:vc];
  nc.modalPresentationStyle = UIModalPresentationFormSheet;
  nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
  [self presentModalViewController:nc animated:true];
  [nc release];
  [vc release];
}

Cela fonctionne très bien: la vue apparaît. Les problèmes commencent lorsque je tente de le rejeter dans une orientation autre que le paysage.

ModalViewController, la méthode suivante est déclenchée par un UITabBarButton dans la barre de navigation:

- (void) closeButtonInNavBarWasClicked:(id)sender {
  [self dismissModalViewControllerAnimated:true];
}

Et c'est là que les problèmes commencent.

Lorsque ce code est appelé, la vue modale disparaît, mais: le TabBarController (la vue racine de vue partagé) est tourné soudainement et redimensionnée. Le contenu est tout à coup sur le côté, et recouvre partiellement la vue détaillée. Les détails ne sont pas redimensionnées vue d'être plus petit, il est juste en partie couvert par la vue racine.

La seule situation où ce problème ne semble pas est quand je tape sur la cellule TableViewController1 lorsque l'application est en mode portrait. En dépit de la vue racine étant dans un popover (qui pourrait être une source suffisante de bugs), tout fonctionne très bien.

Certaines choses que je l'ai déjà essayé, sans succès:

  • Dump la barre d'onglets, afficher uniquement TableViewController1 comme contrôleur de racine de la vue split
  • Créer un protocole de délégué afin que le parent TableViewController1 rejette le point de vue modal plutôt que les MyModalClass se voir.
  • Présentation / rejet de la vue modale sur TableViewController1.splitViewController fait réellement empirer les choses. Le point de vue ne semble même pas
  • Sacrifier plusieurs chèvres aussi n'a pas aidé.

Je énormement apprécier toute contribution sur cette question.

Était-ce utile?

La solution

J'ai une sorte de-réponses à ma question: je Instruments d'éliminer systématiquement toutes les fuites de mémoire dans mon application. Une fois que je l'avais fait, le problème a disparu.

Autres conseils

J'ai eu le même problème que vous, je l'ai résolu par la force programatically temporairement tourner ma présentation viewController (une fois retourné à elle), dans sa méthode viewDidAppear à une rotation arbitraire. Bien sûr, sans animation. Et puis tourner de nouveau à l'orientation voulu (que je sauvé en avant la rotation).

Donc, si VC1 affiche VC2 modalement, et la rotation de l'utilisateur VC2 I définir l'orientation de VC1 selon l'orientation actuelle de VC2 en appelant: UIInterfaceOrientation currentOrientation = self.interfaceOrientation; // magasin orientation actuelle de VC2 (vue modal) [VC1 willRotateToInterfaceOrientation: currentOrientation durée: 0];

Alors je VC2 dissmiss et viewWillAppear de VC1 Je fais ceci:

- (void) viewDidAppear: (BOOL) animée {

[super viewDidAppear:animated];

/* Store wanted orientation */
UIInterfaceOrientation currentOrientation = self.interfaceOrientation; 

/* rotate to some arbitrary orientation, this solves the bug. */
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortraitUpsideDown animated:NO]; 

[[UIDevice currentDevice] setOrientation:currentOrientation animated:NO]; //restore wanted orientation.

}

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