Je dois lancer un contrôleur de vue à partir du délégué de l'application.
Comme vous le feriez pour séparer les contrôleurs de vue.
J'ai une déclaration if que si true doit montrer un contrôleur de vue, cela se trouve dans le délégué de l'application.
Comment puis-je faire cela depuis le délégué de l'application?
la réponse de c_rath est généralement correcte, mais vous n'avez pas besoin de faire du contrôleur de vue un contrôleur de vue racine. Vous pouvez en fait déclencher une séparation entre la vue de dessus sur la pile de navigation et tout autre contrôleur de vue, même à partir du délégué de l'application. Par exemple, pour pousser un contrôleur de vue de storyboard, vous pouvez faire ceci:
Swift 3.0 et versions ultérieures
// Access the storyboard and fetch an instance of the view controller
let storyboard = UIStoryboard(name: "Main", bundle: nil);
let viewController: MainViewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! MainViewController;
// Then Push that view controller onto the navigation stack
let rootViewController = self.window!.rootViewController as! UINavigationController;
rootViewController.pushViewController(viewController, animated: true);
Swift 2.0 et versions antérieures
// Access the storyboard and fetch an instance of the view controller
var storyboard = UIStoryboard(name: "Main", bundle: nil)
var viewController: MainViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as MainViewController
// Then Push that view controller onto the navigation stack
var rootViewController = self.window!.rootViewController as UINavigationController
rootViewController.pushViewController(viewController, animated: true)
si vous voulez utiliser segue
identifier
, vous pouvez utiliser dans Swift
2.2
.
self.window?.rootViewController!.performSegueWithIdentifier("YOUR SEGUE IDENTIFIER", sender: nil)
et pour Swift 3.1:
self.window?.rootViewController!.performSegue(withIdentifier: "YOUR SEGUE IDENTIFIER", sender: nil)
Vous n'avez pas besoin d'instancier un nouveau ViewController, il vous suffit de séparer presentedViewController
comme ceci (Swift 3.0+)
guard let mainController = self.window?.rootViewController?.presentedViewController as? MainViewController else { return }
mainController.performSegue(withIdentifier: "SEGUE_ID", sender: nil)
Dans le cas où votre application est basée sur UITabBarController
, vous devez:
viewControllers
à partir de UITabBarController
UITabBarController
Bien sûr, vous devez connaître l'index de votre contrôleur de vue dans votre UITabBarController
Exemple de code:
guard let tabBarController = self.window?.rootViewController?.presentedViewController as? UITabBarController else { return }
guard let tabBarViewControllers = tabBarController.viewControllers else { return }
guard let mainViewController = tabBarViewControllers[0] as? MainViewController else { return }
tabBarController.selectedIndex = 0
mainViewController(withIdentifier: "SEGUE_ID", sender: nil)
Voici ce que vous feriez si votre rootViewController
avaitPAShérité de UINavigationViewController
:
En gros, vous vérifiez l’onglet actuellement présenté, puis appuyez sur depuisQUEcontrôleur de vue, plutôt que sur la variable rootViewController
qui hérite de UITabBarController
.
let root = self.window?.rootViewController as UITabBarController
switch(root.selectedIndex){
case 0:
root.viewControllers?[0].pushViewController(viewController, animated: true)
break;
case 1:
root.viewControllers?[1].pushViewController(viewController, animated: true)
break
default:
println("Error presenting ViewController")
break;
}
Mon application a un initial/rootViewController qui hérite de UITabBarController
, chacun de ses UITabBar
Relationship Controllers hérite de UINavigationController
, ce qui me permet de pushViewController
.
Vous ne pouvez pas réellement effectuer de transition dans AppDelegate, car une transition est une transition d'une scène à une autre. Cependant, vous pouvez instancier un nouveau contrôleur de vue et le présenter à partir de AppDelegate. Quelque chose comme ce qui suit devrait fonctionner ...
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
var storyboard = UIStoryboard(name: "Main", bundle: nil)
var viewController: MasterViewController = storyboard.instantiateViewControllerWithIdentifier("viewController") as MasterViewController
window?.rootViewController = viewController
window?.makeKeyAndVisible()
return true
}
si vous voulez effectuer la transition entre AppDelegate. Implémentez la séparation entre ViewControllers dans votre storyboard. Donnez l'identifiant à votre segue.
self.window?.rootViewController!.performSegue(withIdentifier: "your_identifier", sender: nil)
Si vous souhaitez vous connecter à App Delegate Swift 3.0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if UserDefaults.standard.bool(forKey: PARAM.STATUS) {
DispatchQueue.main.async {
self.window?.rootViewController?.performSegue(withIdentifier: PARAM.SEGUETOHOME, sender: nil)
}
}
// Override point for customization after application launch.
return true
}
Notez que si vous n’utilisez pas
DispatchQueue.main.async
alors que votre séquence n’est pas