【问题标题】:iOS - Monitoring app flow from AppDelegateiOS - 从 AppDelegate 监控应用程序流
【发布时间】:2016-10-07 11:16:51
【问题描述】:

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

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

是否有任何类型的 KVONSNotification 用于通知我的单身人士新的 UIView 出现/删除?有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: ios xcode uiview key-value-observing


    【解决方案1】:

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

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

    【讨论】:

    • 除了 UITabBarController 之外,有没有办法做同样的事情?
    【解决方案2】:

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

    @property (strong, nonatomic) UIViewController *currentViewController;
    

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

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

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

    【讨论】:

      【解决方案3】:

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

      在这里,我在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)中侦听通知。

      【讨论】:

      • 问题是我希望 Singleton 更通用并且适用于现有项目。这就是为什么我希望它具有 AppDelegate 作为参数。
      • 我不明白这如何使这个策略无效。如果可以将Singleton添加到项目中,也可以添加类别到项目中。
      • 我会在稍后阶段将其转换为框架。这就是为什么我试图找到它,如果我可以在没有任何其他代码的情况下监控应用程序的流程
      猜你喜欢
      • 2018-07-05
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2016-12-18
      相关资源
      最近更新 更多