web-dev-qa-db-fra.com

Comment puis-je présenter par programme un contrôleur de vue de manière modale?

Edit: Lors de la résolution de ce problème, j’ai trouvé qu’il était beaucoup plus facile de commencer par votre UITabBarController, puis de valider la connexion via votre méthode AppDelegate.m de didFinishLaunchingWithOptions:.

Question: Ce code est dans la méthode application didFinishLaunchingWithOptions: dans mon AppDelegate.m

if([result isEqualToString: @"log"])
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"TabBarControl"];
    [(UINavigationController*)self.window.rootViewController pushViewController:ivc animated:NO];
    NSLog(@"It's hitting log");
}

Il faut simplement une réponse HTTP pour l'utilisateur connecté, puis les amener à mon TabBarController. Le problème est qu’il utilise une transition Push plutôt que modal pour afficher la page. Étant donné que la méthode presentModalViewController est obsolète ou supprimée dans iOS7, comment puis-je forcer par programmation une présentation modale?

MODIFIER:  )

14
Chisx

L'ancienne méthode presentViewController:animated: étant obsolète, nous devons utiliser presentViewController:animated:completion à la place. Vous devez maintenant simplement ajouter un paramètre completion à la méthode - cela devrait fonctionner:

if([result isEqualToString: @"log"])
{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"TabBarControl"];
    [(UINavigationController*)self.window.rootViewController presentViewController:ivc animated:NO completion:nil];
    NSLog(@"It's hitting log");
}

Les documents sont un bon point de départ - les documents pour UIViewController presentViewController:animated vous indiquent exactement ce que vous devez savoir:

presentModalViewController: animé:

Présente une vue modale gérée par le contrôleur de vue donné à l'utilisateur. (Obsolète dans iOS 6.0. Utilisez presentViewController:animated:completion: à la place.)

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
30
Undo

Rapide

Puisque la réponse acceptée est en Objective-C, voici comment procéder dans Swift. Contrairement à la réponse acceptée, ma réponse ne fait toutefois pas référence au contrôleur de navigation.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewControllerWithIdentifier("secondViewControllerId") as! SecondViewController
self.presentViewController(secondViewController, animated: true, completion: nil)

Modifiez le nom du storyboard, le contrôleur de vue et l'id si nécessaire.

Voir aussi comment écarter un contrôleur de vue par programme .

18
Suragch

Dans Swift 4.2, vous pouvez le faire comme ceci. Pour ceux qui veulent cette réponse dans la version mise à jour de Swift.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "ExampleViewController")
self.present(controller, animated: true, completion: nil)
1
Shahzaib Maqbool
 let storyB = UIStoryboard(name: "Main", bundle: nil) 
 let secondViewController = 
 storyB.instantiateViewController(withIdentifier: 
 "SecondViewControllerID") as! SecondViewController
 self.present(secondViewController, animated: true, completion: nil)

Dans le secondViewController, utilisez ce code pour revenir en arrière.

 self.dismiss(animated: true, completion: nil)

Au Swift 3/4

     let storyB = UIStoryboard(name: "Main", bundle: nil) 
     let secondViewController = storyB.instantiateViewController(withIdentifier: "SecondViewControllerID") as! SecondViewController
     self.present(secondViewController, animated: true, completion: nil)
0
Sh_Khan