У меня есть приложение, которое имеет несколько видов.
Когда я возвращаюсь на передний план с фона, я хочу определить, в какой точке зрения я сейчас. Как мне это сделать?
[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