Как определить, какой вид загружается при возврате на передний план из фона в iOS?

У меня есть приложение, которое имеет несколько видов. Когда я возвращаюсь на передний план с фона, я хочу определить, в какой точке зрения я сейчас. Как мне это сделать?

[EDIT]

Я понимаю, что свойство visibleViewController для navigationController может помочь. Но я хочу знать, как использовать возвращаемый им указатель в сравнении с объектом UIViewController. Как мы можем сравнивать указатели? Некоторые фрагменты кода будут очень полезны.

Ответ 1

В зависимости от того, какой контроллер корневого представления вы используете. Если у вас есть контроллер навигации, вы можете проверить свойство visibleViewController, чтобы увидеть, какой контроллер просмотра находится в настоящий момент поверх стека навигации. Для контроллера панели вкладок проверьте свойство selectedViewController, чтобы увидеть, какая вкладка активна. Если это комбинация из двух, используйте оба метода в тандеме.

Каждый из контроллеров представления контейнеров может каким-то образом определить, что выбрано или отображается на экране. Если вы делаете свою собственную специальную настройку, вам придется придумать хороший способ самостоятельно определить эту информацию.

Ответ 2

zirinisp Ответ в Swift:

extension UIWindow {
    func visibleViewController() -> UIViewController? {
        if let rootViewController: UIViewController  = self.rootViewController {
            return UIWindow.getVisibleViewControllerFrom(rootViewController)

    }
    return nil
}

class func getVisibleViewControllerFrom(vc:UIViewController) -> UIViewController {
if vc.isKindOfClass(UINavigationController.self) {

    let navigationController = vc as UINavigationController
    return UIWindow.getVisibleViewControllerFrom( navigationController.visibleViewController)

} else if vc.isKindOfClass(UITabBarController.self) {

    let tabBarController = vc as UITabBarController
    return UIWindow.getVisibleViewControllerFrom(tabBarController.selectedViewController!)

} else {

    if let presentedViewController = vc.presentedViewController {

        return UIWindow.getVisibleViewControllerFrom(presentedViewController)

    } else {

        return vc;
    }
}
}

Использование:

if let topController = window.visibleViewController() {
            println(topController)
        }

Ответ 3

Вы хотите знать, когда приложение появилось на переднем плане и стало активным. Это должно быть где-то в корне вашей иерархии диспетчера представлений - возможно, ваш AppDelegate, возможно, ваш контроллер корневого представления.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appActive:)
                                                 name:UIApplicationDidBecomeActiveNotification 
                                               object:nil];

В уведомлении appActive: (NSNotification *); или какой-либо метод, который вы называете это - делайте то, что предложил ЛукасТизма.

Также помните, чтобы очистить ваши уведомления, когда вы закончите

 [[NSNotificationCenter defaultCenter] removeObserver:self];

Ответ 4

Мне всегда нравятся решения, которые включают категории, поскольку они запираются и могут быть легко использованы повторно.

Итак, я создал категорию в UIWindow. Теперь вы можете вызвать visibleViewController в UIWindow, и это даст вам видимый контроллер просмотра, выполнив поиск по иерархии контроллера. Это работает, если вы используете контроллер навигации и/или панели вкладок. Если у вас есть другой тип контроллера, предлагайте, пожалуйста, дайте мне знать, и я могу добавить его.

UIWindow + PazLabs.h(заголовочный файл)

#import <UIKit/UIKit.h>

@interface UIWindow (PazLabs)

- (UIViewController *) visibleViewController;

@end

UIWindow + PazLabs.m(файл реализации)

#import "UIWindow+PazLabs.h"

@implementation UIWindow (PazLabs)

- (UIViewController *)visibleViewController {
    UIViewController *rootViewController = self.rootViewController;
    return [UIWindow getVisibleViewControllerFrom:rootViewController];
}

+ (UIViewController *) getVisibleViewControllerFrom:(UIViewController *) vc {
    if ([vc isKindOfClass:[UINavigationController class]]) {
        return [UIWindow getVisibleViewControllerFrom:[((UINavigationController *) vc) visibleViewController]];
    } else if ([vc isKindOfClass:[UITabBarController class]]) {
        return [UIWindow getVisibleViewControllerFrom:[((UITabBarController *) vc) selectedViewController]];
    } else {
        if (vc.presentedViewController) {
            return [UIWindow getVisibleViewControllerFrom:vc.presentedViewController];
        } else {
            return vc;
        }
    }
}

@end