iOS - 从 AppDelegate 监控应用程序流

iOS - Monitoring app flow from AppDelegate

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

例如:查看A B C A 是 Navigation Controller 中的第一个视图。我的 Singleton 知道当前视图是 A。然后我们推送视图 B,Singleton 被通知视图 B 现在是当前视图。 C也一样,现在我们pop C,Singleton就知道当前view是B了。

有什么 KVONSNotification 可以通知我的单身人士一个新的 UIView 是 appeard/removed?这个问题有什么替代方案吗?

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

@property (strong, nonatomic) UIViewController *currentViewController;

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

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

通过这种方式您可以获得当前的活动视图。

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

在这里,我在 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)。

注册所有通知后,我发现了 UINavigationControllerDidShowViewControllerNotification

对于这个观察者: [notifyCenter addObserver:self selector:@selector(viewAppeared:) name:@"UINavigationControllerDidShowViewControllerNotification" object:nil]; 我可以监控 UINavigationController 的 activity。