Как определить, какое представление загружается при возврате на передний план из фона в iOS? - PullRequest
1 голос
/ 21 сентября 2011

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

[EDIT]

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

Ответы [ 4 ]

3 голосов
/ 19 декабря 2014

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)
        }
2 голосов
/ 21 сентября 2011

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

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

1 голос
/ 18 февраля 2014

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

Итак, я создал категорию в 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
1 голос
/ 21 сентября 2011

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

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

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

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

 [[NSNotificationCenter defaultCenter] removeObserver:self];
...