iOS - 监控来自AppDelegate的应用流程

时间:2016-10-07 11:16:52

标签: ios xcode uiview key-value-observing

我正在尝试创建 Singleton ,它将从 AppDelegate 初始化。目的是监视所有UIViewControllers(活动的)并在控制台上打印类的类型(作为概念证明)。所以我的基本想法是在AppDelegate中初始化单例并将参数作为参数传递给AppDelegate。然后我必须以某种方式监视哪一个是活动视图。

例如:查看A B C. A是导航控制器中的第一个视图。我的Singleton知道当前视图是A.然后我们按下视图B,并且Singleton被通知视图B现在是当前视图。与C相同。现在我们弹出C和Singleton知道当前视图是B。

是否有任何 KVO NSNotification 用于通知我的单身人员是否有新的UIView被上诉/删除?这个问题的任何替代方案?

3 个答案:

答案 0 :(得分:1)

在注册了我发现的有关UINavigationControllerDidShowViewControllerNotification

的所有通知后

有了这个观察者:     [notifyCenter addObserver:self selector:@selector(viewAppeared:) name:@"UINavigationControllerDidShowViewControllerNotification" object:nil];我能够监控UINavigationController的活动。

答案 1 :(得分:0)

您可以通过在appdelegate中创建视图控制器对象来获取当前的View控制器,如

@property (strong, nonatomic) UIViewController *currentViewController;

然后在视图上将显示当前视图控制器给出当前对应用委托对象的引用,如

AppDelegate *myAppd = (AppDelegate*)[[UIApplication sharedApplication]delegate];
    myAppd.currentViewController = self;

这样您就可以获得当前的活动视图。

答案 2 :(得分:0)

一种方法是选择您想要了解的特定方法并拦截它。

在这里,我在UIViewController上创建了一个类别,并且只要通常会调用控制器viewWillAppear:,就会提供我想要调用的方法:

#include <objc/runtime.h>

@implementation UIViewController (Swap)

+ (void)load
{
    NSLog(@"Exchange implementations");
    method_exchangeImplementations(
     class_getInstanceMethod(self, @selector(viewWillAppear:)),
     class_getInstanceMethod(self, @selector(customViewWillAppear:)));
}

- (void)customViewWillAppear:(BOOL)animated
{
    // Call the original method, using its new name
    [self customViewWillAppear:animated];

    NSLog(@"Firing %@ for %@", VIEW_CONTROLLER_APPEARED, self);
    [[NSNotificationCenter defaultCenter] postNotificationName:VIEW_CONTROLLER_APPEARED
                                                        object:self];
}

@end

在此之后,只需要在任何需要知道的对象中收听通知(例如 Singleton )。