Выполнить Segue из App Delegate Swift

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

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

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

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

7 ответов

Решение

Ответ 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)

Если вы хотите использовать segueidentifierВы можете использовать в Swift2.2,

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

и для Swift 3.1:

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

Если вы хотите перейти в 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 не выполняет

На самом деле вы не можете выполнить переход из AppDelegate, поскольку переход - это переход от одной сцены к другой. Однако вы можете создать новый контроллер представления и представить его из 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
}

Вот что бы вы сделали, если ваш 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 от них.

Вам не нужно создавать экземпляр нового ViewController, просто выполните переход от presentedViewController как это (Swift 3.0+)

guard let mainController = self.window?.rootViewController?.presentedViewController as? MainViewController else { return }
mainController.performSegue(withIdentifier: "SEGUE_ID", sender: nil)

В случае, если ваша заявка основана на UITabBarController, Вы должны:

  • получить UITabBarController
  • выберите правильный контроллер из viewControllers коллекция из UITabBarController
  • изменить индекс UITabBarController
  • наконец, вы можете выполнить Segue

Конечно, вы должны знать индекс вашего контроллера представления в вашем UITabBarController

Пример кода:

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)

Если вы хотите выполнить переход от AppDelegate. Реализуйте переход между ViewControllers в вашей раскадровке. Дайте идентификатор вашей теме.

self.window?.rootViewController!.performSegue(withIdentifier: "your_identifier", sender: nil)
Другие вопросы по тегам