Контроллер текущего вида из AppDelegate? - программирование
Подтвердить что ты не робот

Контроллер текущего вида из AppDelegate?

Есть ли способ получить текущий контроллер вида из AppDelegate? Я знаю, что есть rootViewController, но это не то, что я ищу.

4b9b3361

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