Выполните 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 не выполнить