如何检测您的 ViewController 是不是是从 AppDelegate 推送的?
Posted
技术标签:
【中文标题】如何检测您的 ViewController 是不是是从 AppDelegate 推送的?【英文标题】:How to detect if your ViewController was pushed from AppDelegate?如何检测您的 ViewController 是否是从 AppDelegate 推送的? 【发布时间】:2013-11-18 21:09:25 【问题描述】:在我的 AppDelegate 中,如果用户键入我的自定义 url 方案,我会显示一个 ViewController。它在我的 ViewController 出现时起作用。但是,我需要检测我的 ViewController 是否是从 App 委托推送的。执行此操作的最佳方法或行动方案是什么?我只想检测它是否来自 AppDelegate 而不是其他地方。
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
// attempt to extract a token from the url
ViewController *controller = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
编辑:为了澄清我想要做得更好的事情,当 appdelegate 呈现我的视图控制器时,我需要能够在我的视图控制器内部检测到它出现是因为 app 委托中的方法。有点像这样
视图控制器
-(void) ViewDidLoad
if (this controller was presented from App delegate)
do this
else
do nothing
【问题讨论】:
你应该更详细地解释你的主要问题。你想解决什么问题?你为什么关心它是从哪里推送的?你有没有机会从其他地方推动这个控制器? App Delegate 永远不会神奇地移除你的控制器,所以如果它被推送(当你说“推送”时,我假设你的意思是“解雇”),那么你的代码就做到了,你可以看到。如果您的意思是“推动”某些东西出现在它面前,那么如果您的 App Delegate 发生这种情况,那就是您在做这件事。如果您的意思是“推送”其他一些代码从您的代码中显示另一个视图控制器,您始终可以实现viewWillDisappear
,但我不知道在这种情况下您所说的“仅来自 AppDelegate”是什么意思。
【参考方案1】:
简单地这样做:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
ViewController *controller = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
// here you know that your controller is pushed from the AppDelegate, then you can do other things just after the push
[controller callControllerPublicMethod];
当你将它推入另一个控制器时,根本不做任何事情。
【讨论】:
【参考方案2】:为什么不在ViewController
中编写您自己的自定义初始化方法,并在从应用委托调用时将参数设置为true,而在其他任何地方将其设置为false。
【讨论】:
以上是关于如何检测您的 ViewController 是不是是从 AppDelegate 推送的?的主要内容,如果未能解决你的问题,请参考以下文章
如何检测您的 Microsoft Access 应用程序是不是已编译,即作为 ACCDE 运行
如何仅使用代码在您的 iOS 应用程序中显示 ViewController?