web-dev-qa-db-fra.com

Présenter plusieurs contrôleurs de vue modale?

mettre à jour:
J'ai à nouveau fait face à ce problème et j'ai trouvé un autre moyen. Si le contrôleur de présentation n'est pas intégré au contrôleur de navigation, il sera masqué si le contrôleur présenté n'est pas en plein écran et devient noir. Méthode setModalPresentationStyle: UIModalPresentationCurrentContext peut être appliqué uniquement au contrôleur de navigation. Alors intégrez le contrôleur de présentation dans UINavigationController, définissez-le sur UIModalPresentationCurrentContext et présentez le nouveau contrôleur - vous obtiendrez un contrôleur de dialogue.

Je présente le contrôleur de recherche, il a tableView que Push on stack contrôleur détaillé.

Le contrôleur détaillé peut présenter le contrôleur de vue avec un message, il est constitué d’un petit fond UIView et d’un fond semi-transparent.

Problème: lors de la présentation du dernier contrôleur de vue, tous les contrôleurs de vue sous ce dernier sont masqués et le contrôleur, le contrôleur de recherche présenté, devient visible.

Voici ce que je fais:

SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];

que la table pousse la vue détaillée:

DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];

et vue détaillée présentant la boîte de message:

MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];

Quand il est licencié, tous les contrôleurs sous lui sont devenus visibles.

mettre à jour:

tout ce que je voulais, c'est présenter de manière modale un contrôleur de vue qui aura uitableview. À partir de ce tableau pour afficher une vue détaillée qui pourra afficher une boîte de message. La boîte de message doit être un autre contrôleur de vue. Et lorsque la boîte de message est affichée, les deux contrôleurs précédents disparaissent. c'est le problème.

13
trickster77777

Le moyen le plus simple d’y parvenir consiste simplement à créer les VC vous voulez présenter modalement et présenter l'un après l'autre . Malheureusement, ça ne marchera pas. Ce que vous obtenez est juste le premier VC a présenté, tous les autres ne vont nulle part. UIKit vient de ne pas coopérer avec vous ici.

http://xissburg.com/presenting-multiple-modal-view-controllers-at-once/

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
4
Gtx

Fermez tous les contrôleurs de vue au-dessus du contrôleur de vue présenté.

La documentation d'Apple suit:

Si vous présentez successivement plusieurs contrôleurs de vue, créant ainsi une pile de contrôleurs de vue présentés, l'appel de cette méthode sur un contrôleur de vue situé plus bas dans la pile supprime son contrôleur de vue enfant immédiat et tous les contrôleurs de vue situés au-dessus de cet enfant sur la pile. Lorsque cela se produit, seule la vue la plus haute est ignorée de manière animée. tous les contrôleurs de vue intermédiaires sont simplement retirés de la pile. La vue la plus haute est supprimée à l'aide de son style de transition modale, qui peut différer des styles utilisés par d'autres contrôleurs de vue plus bas dans la pile.

Ignorez deux contrôleurs de vue modale.

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:NULL];

https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#jumpTo_51

10
Rei Kubonaga

Dans certaines situations, vous pouvez faire en sorte que chaque contrôleur de vue présenté de façon modale présente le suivant.

let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
    modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
    window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}
9
SlimeBaron

Cette réponse peut sembler un peu non conventionnelle, mais cela fonctionne. Il vous permet "d'ouvrir plusieurs modaux", mais de n'en afficher qu'un à la fois. La clé est d’avoir un seul modal, mais utilisez un contrôleur à barre de tabulation pour basculer entre View Controller s.

 multiple modals

  1. Câblez votre séquence modale du bleu (présentation) View Controller à un conteneur modal (qui est juste un View Controller _)
  2. Le conteneur modal contient uniquement un vue du conteneur dont le seul but est d'incorporer un contrôleur de barre d'onglets.
  3. Incorporer un contrôleur de barre d'onglets à l'intérieur de la vue du conteneur
  4. Chaque onglet peut être un View Controller} séparé, représentant "plusieurs modaux".
  5. Définissez le contrôleur de la barre d'onglets's la barre d'onglets sur masqué
  6. Basculer entre les modaux à l'aide de tabBarController?.selectedIndex = 1
  7. Fermez le modal normalement avec dismissViewControllerAnimated(true, completion: nil) 

Cela ressemblerait à ceci:

 enter image description here

8
Robert Chen

Définissez la bonne modalPresentationStyle sur les deux la navigationController ET la viewController elle-même.

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);

[self presentViewController:vcToPresent animated:YES completion:^{
    self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
1
rizzes

J'ai trouvé une solution: fournissez votre propre animation personnalisée:

    let transition: CATransition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionReveal
    transition.subtype = kCATransitionFromBottom
    self.view.window!.layer.add(transition, forKey: nil)
    self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)
0
Antzi