iOS - 从 AppDelegate 监控应用程序流
Posted
技术标签:
【中文标题】iOS - 从 AppDelegate 监控应用程序流【英文标题】:iOS - Monitoring app flow from 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。
是否有任何类型的 KVO 或 NSNotification 用于通知我的单身人士新的 UIView
出现/删除?有什么办法可以解决这个问题吗?
【问题讨论】:
【参考方案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添加到项目中,也可以添加类别到项目中。 我会在稍后阶段将其转换为框架。这就是为什么我试图找到它,如果我可以在没有任何其他代码的情况下监控应用程序的流程以上是关于iOS - 从 AppDelegate 监控应用程序流的主要内容,如果未能解决你的问题,请参考以下文章
从 iOS 框架引用 UIApplication 或 AppDelegate 窗口属性会导致应用被 App Store 拒绝吗?
使用 Swift2 从 AppDelegate 重新打开 iOS 应用程序到指定的导航控制器