Есть ли способ получить текущий контроллер вида из AppDelegate? Я знаю, что есть rootViewController, но это не то, что я ищу.
Контроллер текущего вида из AppDelegate?
Ответ 1
Если у вас есть UINavigationController в appDelegate, тогда используйте его свойство topViewController или visibleViewController
Ответ 2
Если ваш диспетчер представления корневого приложения является UINavigationController
, вы можете сделать это:
((UINavigationController*)appDelegate.window.rootViewController).visibleViewController;
Аналогично, если это a UITabBarController
, вы можете сделать это:
((UITabBarController*)appDelegate.window.rootViewController).selectedViewController;
Конечно, явное кастинг вроде этого грязно. Лучше было бы захватить ссылку самостоятельно, используя сильные типы.
Ответ 3
Это может помочь
- (UIViewController *)topViewController{
return [self topViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController *)topViewController:(UIViewController *)rootViewController
{
if (rootViewController.presentedViewController == nil) {
return rootViewController;
}
if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController;
UIViewController *lastViewController = [[navigationController viewControllers] lastObject];
return [self topViewController:lastViewController];
}
UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;
return [self topViewController:presentedViewController];
}
Быстрая версия:
extension UIApplication {
class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return topViewController(base: nav.visibleViewController)
}
if let tab = base as? UITabBarController {
if let selected = tab.selectedViewController {
return topViewController(base: selected)
}
}
if let presented = base?.presentedViewController {
return topViewController(base: presented)
}
return base
}
}
Взято из: https://gist.github.com/snikch/3661188
Ответ 4
Получить объект appDelegate:
MyAppDelegate *tmpDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
Как предложил бериллий, вы можете использовать свойства UINavigationController для доступа к вашему текущему контроллеру.
Итак, код будет выглядеть так:
id myCurrentController = tmpDelegate.myNavigationController.topViewController;
или
NSArray *myCurrentViewControllers = tmpDelegate.myNavigationController.viewControllers;
Ответ 5
Сделать расширение:
extension UIApplication {
class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
if let nav = base as? UINavigationController {
return topViewController(nav.visibleViewController)
}
if let tab = base as? UITabBarController {
let moreNavigationController = tab.moreNavigationController
if let top = moreNavigationController.topViewController where top.view.window != nil {
return topViewController(top)
} else if let selected = tab.selectedViewController {
return topViewController(selected)
}
}
if let presented = base?.presentedViewController {
return topViewController(presented)
}
return base
}
}
Применение:
if let rootViewController = UIApplication.topViewController() {
//do sth with root view controller
}
Ответ 6
Вы можете получить текущий контроллер представления из rootViewController, выполнив поиск представленногоViewController, например:
UIViewController *parentViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController;
while (parentViewController.presentedViewController != nil){
parentViewController = parentViewController.presentedViewController;
}
UIViewController *currentViewController = parentViewController;
Он работает со мной. Надеюсь, это поможет:)
Ответ 7
Для тех, кто не использует UINavigationController
, а их контроллер представления по умолчанию - это UIViewController
, вы можете проверить, какой контроллер просмотра активен (или представлен) в AppDelegate
:
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
if let rootViewController = self.window!.rootViewController {
if let presentedViewController = rootViewController.presentedViewController {
return presentedViewController.supportedInterfaceOrientations()
}
} // Else current view controller is DefaultViewController
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
Как вы можете видеть, я проверяю текущий контроллер представлений, чтобы поддерживать разные ориентации интерфейса для определенных контроллеров. Для всех, кто заинтересован в использовании этого метода для поддержки конкретных, в каждом контроллере представления, который нуждается в определенной ориентации, должно быть указано следующее.
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.All.rawValue)
}
Примечание: Этот код был написан с помощью Swift 1.2
Ответ 8
Быстрое решение:
self.window.rootViewController.presentedViewController.
Это должно получить то, что вам нужно.
Ответ 9
Часто мне нужно получить контроллер отображения, который в настоящее время отображается. Это может означать контроллер представления в верхней части стека текущего UINavigationController, текущий представленный контроллер представлений и т.д. Поэтому я написал эту функцию, которая показывает ее большую часть времени, и что вы можете использовать внутри расширения UIViewController.
Код в Swift 3:
func currentViewController(
_ viewController: UIViewController? =
UIApplication.shared.keyWindow?.rootViewController)
-> UIViewController? {
guard let viewController =
viewController else { return nil }
if let viewController =
viewController as? UINavigationController {
if let viewController =
viewController.visibleViewController {
return currentViewController(viewController)
} else {
return currentViewController(
viewController.topViewController)
}
} else if let viewController =
viewController as? UITabBarController {
if let viewControllers =
viewController.viewControllers,
viewControllers.count > 5,
viewController.selectedIndex >= 4 {
return currentViewController(
viewController.moreNavigationController)
} else {
return currentViewController(
viewController.selectedViewController)
}
} else if let viewController =
viewController.presentedViewController {
return viewController
} else if viewController.childViewControllers.count > 0 {
return viewController.childViewControllers[0]
} else {
return viewController
}
}
Назовите его с помощью currentViewController()