从 appDelegate 呈现 ViewController

Posted

技术标签:

【中文标题】从 appDelegate 呈现 ViewController【英文标题】:Presenting ViewController from appDelegate 【发布时间】:2014-09-04 21:19:54 【问题描述】:

每当应用程序从 applicationDidEnterBackground 方法中的后台运行时,我都需要从 appDelegate 显示一个 ViewController。

*securityCheck 提示用户输入密码,与 ios 中的普通密码非常相似。验证密码后,我在 securityCheck 中调用 dimissViewControllerAnimated 并留下空白的 UINavigationController,因为视图是从 appDelegate 呈现的,所以我没有记录谁呈现了视图,所以我不能 popToRootViewController。

我的问题是如何正确关闭 SecurityCheckViewController 以便它显示在应用进入后台之前用户所在的 ViewController。

这是我的代码:

这个方法在 AppDelegate.m 中被调用

- (void)securityCheck 

   SecurityCheckViewController *securityCheck = [[SecurityCheckViewController alloc] init];
   UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:securityCheck];

   [securityCheck presentedByAppDelegate:YES];

   self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
   [self.window setRootViewController:navigationController];
   [self.window makeKeyAndVisible];

然后在 SecurityCheckViewController.m 我有

- (void)unlockWasSuccessfulForPadLockScreenViewController:(ABPadLockScreenViewController *)padLockScreenViewController 

    [self.appDelegate securityCheckDone];
    [padLockScreenViewController dismissViewControllerAnimated:YES completion:nil];

     NSLog(@"Sucsessfull Unlock");I'm 

【问题讨论】:

什么是presentedByAppDelegate 这是我设置的 BOOL,所以我知道它是从 AppDelegate 呈现的,因为我还在每个应用程序启动时呈现 securityCheck,只有在验证后我调用 popToRootViewController 并且它工作。 马科斯,你在用故事板吗 是的,我正在使用情节提要。 好的,我如何从 appDelegate 内部显示这个视图控制器而不做我所做的?有没有更简单或更好的方法? 【参考方案1】:

礼物

- (void)securityCheck 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    SecurityCheckViewController *securityCheck = [storyboard instantiateViewControllerWithIdentifier:@"securityCheckView"];
    [self.window.rootViewController presentViewController:securityCheck animated:NO completion:nil];

解雇

[self dismissViewControllerAnimated:YES completion:nil];

【讨论】:

如何从 securityCheckDone 方法中解除它? 我不知道你在那个方法中有什么,但如果你在安全控制器中,你所要做的就是[self dismissViewControllerAnimated:YES completion:nil];它会显示堆栈上的前一个控制器跨度> 谢谢你 Meda 你为我澄清了事情 =] 是的,我有点意识到你想多了 +1 有趣的问题【参考方案2】:

您可以从 application:didFinishLaunchingWithOptions

调用它

注意:属性检查器上的所有故事板“initialViewControllers”复选框均已关闭

    UIStoryboard *storyboard = 
        [UIStoryboard storyboardWithName:@"Registration" bundle:nil];

    RegisterViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"RegisterViewController"];

    //this is key else you get a black screen
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];

    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];

【讨论】:

以上是关于从 appDelegate 呈现 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何从 appDelegate 呈现 UIAlertView

从 AppDelegate 呈现特定的视图控制器

从 AppDelegate 到 PresentedViewController 的警报:“尝试在...上呈现 UIAlertController 已经在呈现 UIAlertController”

如何从 appdelegate 呈现和关闭模态视图?

如何从 appdelegate xcode 11 swift 5 呈现视图控制器

如何根据 iOS 中的两个条件从 AppDelegate 呈现两个不同的 ViewController?