Выполните Segue из App Delegate swift

Мне нужно запустить контроллер представления из делегата приложения.

Таким образом, вы можете выполнить сеанс между контроллерами представлений.

У меня есть оператор if, который, если true должен показать контроллер представления, находится в делегате приложения.

Как это сделать из делегата приложения?

Ответ 1

Ответ c_rath в основном прав, но вам не нужно делать контроллер представления контроллером корневого представления. Фактически вы можете инициировать сеанс между верхним видом в стеке навигации и любым другим контроллером представления, даже из приложения-делегата. Например, чтобы нажать контроллер просмотра раскадровки, вы можете сделать это:

Swift 3.0 и более поздние версии

// 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 и ранее

// 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)

Ответ 2

если вы хотите использовать segue identifier, вы можете использовать его в Swift 2.2.

self.window?.rootViewController!.performSegueWithIdentifier("YOUR SEGUE IDENTIFIER", sender: nil)

и для Swift 3.1:

self.window?.rootViewController!.performSegue(withIdentifier: "YOUR SEGUE IDENTIFIER", sender: nil)

Ответ 3

Вот что бы вы сделали, если ваш rootViewController сделал НЕ наследовать от UINavigationViewController:

В основном вы проверяете, что представляет собой вкладка, представленная в настоящее время, а затем нажмите из диспетчера просмотра THAT, а не rootViewController, который наследует от 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;
        }

Мое приложение имеет начальный /rootViewController, который наследует от UITabBarController, каждый из них UITabBar Контроллеры отношений наследуют от UINavigationController, позволяя мне pushViewController от них.

Ответ 4

Вы не можете выполнить segue из AppDelegate, поскольку segue - это переход из одной сцены в другую. Однако одна вещь, которую вы можете сделать, - создать новый контроллер представления и представить его из AppDelegate. Нечто похожее на следующее должно работать...

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
}

Ответ 5

Если вы хотите, чтобы segue в 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
    }

Обратите внимание, если вы не используете DispatchQueue.main.async, чем ваш segue не выполнить