【问题标题】:applicationWillEnterForeground present a view controllerapplicationWillEnterForeground 呈现一个视图控制器
【发布时间】:2013-08-30 19:13:06
【问题描述】:

我有一个 PIN 视图控制器,每次- (void)applicationWillEnterForeground:(UIApplication *)application 触发时都需要显示它。我有多个视图控制器,当应用程序进入后台时,用户可以在其中任何一个上。

问题是我不知道如何在当前处于活动状态的任何视图控制器上显示 PIN 视图控制器。这是我的实现的样子:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    ResourceSingleton *resource = [ResourceSingleton sharedSingleton];
    if ([resource checkIfPINIsEnabled])
    {
        PinViewController *pinView = [[PinViewController alloc] initWithMode:kPINViewControllerModeEnter];
        pinView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self.window.rootViewController presentViewController:pinView animated:YES completion:NULL];
    }
}

但只有当我在第一个视图控制器(根视图控制器)时才会出现 PIN 视图。如何在任何视图控制器上弹出它?

我见过Using applicationwillenterforeground for a passcode screen,但一定有更好的方法还是我错了?这将适用于 iOS 7,所以如果只有 7 具有这样的功能就可以了,但我很确定它也可以在 6 上完成。

【问题讨论】:

    标签: ios objective-c uiviewcontroller appdelegate


    【解决方案1】:

    如果您的根视图控制器是 NavigationController,那么在大多数情况下推送或呈现应该可以工作。您已经准备好所有代码,只需创建一个导航控制器。唯一不起作用的情况是如果已经存在模态视图控制器。在这种情况下,需要先解除。

    这里还有一个处理这种情况的有点杂乱的实现。

    AKPresentedViewController *pres = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"pres"];
    
    UINavigationController *navi = ((UINavigationController*)self.window.rootViewController);
    if (navi.presentedViewController) {
        [navi.presentedViewController dismissViewControllerAnimated:YES completion:^{
            [navi presentViewController:pres animated:NO completion:nil];
            }];
    } else {
        [navi presentViewController:pres animated:NO completion:nil];
    }
    

    【讨论】:

    • @Majster 我也有同样的想法。我在写完这个答案后看到了你的评论,但认为它仍然可以接受。
    • 是的,看来我在某处犯了一个错误,确实创建了一个导航控制器,但推送不起作用。不再重要了,我已经在应用程序委托中创建了视图。它看起来确实有点混乱,但哦,好吧......谢谢。
    • 很好,它对你有用。如果你喜欢,点赞也无妨:)
    【解决方案2】:

    您可以让应用委托处理 PIN 视图的逻辑,并让它成为一个视图,而不是一个视图控制器。只需将视图添加为窗口的子视图,它将显示在其他任何内容之上。

    - (void)applicationWillEnterForeground:(UIApplication *)application {
        UINib *pinNib = [UINib nibWithNibName:@"PINView" bundle:nil];
        UIView *pinView = [pinNib instantiateWithOwner:self options:nil][0];
        [self.window addSubview:pinView];
    }
    

    如果您让应用委托 xib 的文件所有者,那么您可以将视图中所需的任何出口连接到应用委托。

    【讨论】:

    • 我明白了,但我没有 nib 文件,视图是以编程方式创建的。现在该怎么办?
    • @Majster,只需在应用程序委托中以编程方式创建它。
    • 我确实有另一个想法,让我们先讨论这个,如果它不好,请在应用程序委托中以编程方式进行。我如何将self.viewController 设置为UINavigationController 而不是我当前的设置并使用我当前的视图控制器初始化该导航控制器。那么推会工作吗?希望你明白我的意思。
    • @Majster 你已经在你的例子中实例化了它。只需在此处复制即可。
    • @Majster,我不确定我是否理解。如果您的控制器层次结构以导航控制器开始,并且所有其他控制器都被推送到其堆栈中,您可以推送 PinViewController。无论屏幕上有哪个控制器,这都会起作用。如果你也有一些模态视图控制器,我不知道它是否能正常工作。
    【解决方案3】:

    您可以按照他们提到 here 的方式展示您的 PIN 视图控制器。

    为了弹出 PIN 视图控制器,我猜测用户必须输入正确的 PIN,这样 PIN 视图控制器才会消失。在这种情况下,它可以自行弹出:

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      the objective-C codes转换为Swift 4,将代码放入func applicationWillEnterForeground

         let pres = self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "StartVC")
          let navi: UINavigationController = self.window?.rootViewController as! UINavigationController
          if ((navi.presentedViewController) != nil) {
              navi.dismiss(animated: true) {
                  navi.present(pres!, animated: false, completion: nil)
              }
          } else {
              navi.present(pres!, animated: false, completion: nil)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 2014-12-12
        • 2017-09-19
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 2015-07-16
        相关资源
        最近更新 更多