web-dev-qa-db-fra.com

Effectuer Segue De App Delegate swift

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?

14
user3405152

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)
33
Lyndsey Scott

si vous voulez utiliser segueidentifier, vous pouvez utiliser dans Swift2.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)
9
sadasd

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:

  • chercher UITabBarController 
  • sélectionnez le contrôleur approprié dans la collection viewControllers à partir de UITabBarController 
  • changer l'indice de UITabBarController
  • enfin vous pouvez effectuer segue

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)
1
mkul

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.

1
Sakiboy

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
}
0
c_rath

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)
0
Prashant Sharma

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

0
Harshil Kotecha