Как сообщить контроллеру active view, когда вызывается applicationDidBecomeActive?

Я чувствую, что упускаю трюк здесь...

Я просто хочу вызвать viewDidLoad или viewDidAppear на текущем контроллере active view, когда вызывается applicationDidBecomeActive, поэтому я могу сбросить некоторые анимации или что-то еще, когда приложение запускается снова из фона. Некоторые из моих взглядов не заботятся, но другие действительно должны знать.

Я использую раскадровки, и мой файл делегата приложения имеет стандартные функции, но все с пустыми телами. Например, didFinishLaunchingWithOptions просто возвращает да и больше ничего не делает. Раскадровка автоматически делает все, что я думаю.

Итак, как я могу поговорить с текущим контроллером представления из моего довольно пустого, свободного от информации делегата приложения?

5 ответов


Я бы рекомендовал использовать уведомления.

в методе applicationdidBecomeActive делегата приложения введите следующий код:

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil];

в методе инициализации текущего активного контроллера вида подпишитесь на уведомление.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(updateStuff)        
                                             name:@"appDidBecomeActive" 
                                           object:nil];

реализуйте метод "updateStuff" в контроллере, и вы сможете делать все, что захотите, когда приложение станет активным.


вместо отправки уведомления от делегата приложения ОС автоматически отправляет уведомление, которое вы можете наблюдать:

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

и, конечно, убедитесь, что перестали наблюдать когда-то до или внутри вашего метода dealloc, позвонив:

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification 
                                              object:nil];

Swift версия:

вы можете добавить эту строку в метод viewDidLoad

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil)

func viewDidBecomeActive(){
    print("viewDidBecomeActive")
}

вместо того, чтобы пытаться отслеживать, какой ViewController является текущим, вы можете отправить NSNotification из своего AppDelegate и подписаться на него в своем ViewController.. Таким образом, контроллер представления отслеживает, нужно ли ему вызывать viewDidAppear.


ваш AppDelegate будет иметь свойство окна, это окно будет иметь свойство rootViewController. Вы можете найти свой viewController здесь.

Если вы используете TabBarController, rootviewcontroller будет tabbarcontroller, и вы можете вызвать selectedViewController tabbarcontroller, чтобы получить текущий viewController.

UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
if ([rootViewController isKindOfClass:[UITabBarController Class]])
    rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
else if ([rootViewController isKindOfClass:[UINavigationController Class]])
    rootViewController = ((UINavigationController *)rootViewController).topViewController;

[rootViewController viewDidAppear];

если у вас есть более сложная иерархия представлений с контроллерами навигации или модальными представлениями, вы можете вызвать presentedViewController, или topViewController.