1

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

问题是我不知道如何在当前处于活动状态的任何视图控制器上显示 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 视图。如何在任何视图控制器上弹出它?

我已经看到将 applicationwillenterforeground 用于密码屏幕,但必须有更好的方法还是我错了?这将适用于 iOS 7,所以如果只有 7 具有这样的功能就可以了,但我很确定它也可以在 6 上完成。

4

4 回答 4

3

如果您的根视图控制器是 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];
}
于 2013-08-30T20:16:43.633 回答
1

您可以让应用程序委托处理 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 的文件所有者,那么您可以将视图中所需的任何插座连接到应用程序委托。

于 2013-08-30T19:38:41.387 回答
0

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

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

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

希望这可以帮助!

于 2013-08-30T19:44:02.223 回答
0

Objective-C代码转换为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)
    }
于 2019-03-19T09:50:43.023 回答