Выполнить 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)
Если вы хотите использовать 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)
Если вы хотите перейти в 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)