我有一个具有多个视图的应用程序。当我从后台回到前台时,我想确定我目前在哪个视图中。我该怎么做?
[编辑]
我了解 navigationController 的 visibleViewController 属性可能会有所帮助。但是,我想知道如何使用它返回的指针与 UIViewController 对象进行比较。我们如何比较指针?一些代码片段会很有帮助。
我有一个具有多个视图的应用程序。当我从后台回到前台时,我想确定我目前在哪个视图中。我该怎么做?
[编辑]
我了解 navigationController 的 visibleViewController 属性可能会有所帮助。但是,我想知道如何使用它返回的指针与 UIViewController 对象进行比较。我们如何比较指针?一些代码片段会很有帮助。
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)
}
In 取决于您使用的根视图控制器。如果您有导航控制器,您可以检查该visibleViewController
属性以查看当前位于导航堆栈顶部的视图控制器。对于选项卡栏控制器,请检查selectedViewController
属性以查看哪个选项卡处于活动状态。如果是两者的结合,请同时使用这两种方法。
每个容器视图控制器都提供了某种方式来确定屏幕上已选择或当前显示的内容。如果您要进行自己的特殊设置,则必须想出一种自行确定此信息的好方法。
我总是喜欢涉及类别的解决方案,因为它们是固定的并且可以很容易地重复使用。
所以我在 UIWindow 上创建了一个类别。您现在可以在 UIWindow 上调用 visibleViewController ,这将通过向下搜索控制器层次结构为您提供可见视图控制器。如果您使用导航和/或标签栏控制器,这将有效。如果您有其他类型的控制器要建议,请告诉我,我可以添加它。
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
您想知道您的应用程序何时进入前台并变得活跃。这需要位于您的视图控制器层次结构的根目录中 - 可能是您的 AppDelegate,也可能是您的根视图控制器。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
在appActive:(NSNotification *)通知;或任何你称之为的方法——按照 LucasTizma 的建议去做。
还记得在完成后清理您的通知
[[NSNotificationCenter defaultCenter] removeObserver:self];