Ios 应用程序将显示一个视图控制器

Ios 应用程序将显示一个视图控制器,ios,objective-c,uiviewcontroller,appdelegate,Ios,Objective C,Uiviewcontroller,Appdelegate,我有一个PIN视图控制器,每当-(void)应用程序将进入前台:(UIApplication*)应用程序启动时,需要显示该控制器。我有多个视图控制器,当应用程序进入后台时,用户可以在其中任何一个上 问题是我不知道如何在当前处于活动状态的任何视图控制器上显示PIN视图控制器。以下是我的实现的外观: - (void)applicationWillEnterForeground:(UIApplication *)application { ResourceSingleton *resource

我有一个PIN视图控制器,每当
-(void)应用程序将进入前台:(UIApplication*)应用程序
启动时,需要显示该控制器。我有多个视图控制器,当应用程序进入后台时,用户可以在其中任何一个上

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


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

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

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

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

对于弹出PIN-view控制器,我猜用户必须输入正确的PIN,这样PIN-view控制器就会消失。在这种情况下,它会自动弹出:

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

希望这有帮助

您可以按照他们提到的方式展示您的PIN view控制器

对于弹出PIN-view控制器,我猜用户必须输入正确的PIN,这样PIN-view控制器就会消失。在这种情况下,它会自动弹出:

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

希望这有帮助

如果您的根视图控制器是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];
}

如果您的根视图控制器是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];
}
转换为Swift 4,将代码放入功能应用程序WillEnterForeground

   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)
    }
转换为Swift 4,将代码放入功能应用程序WillEnterForeground

   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)
    }

我明白了,但我没有nib文件,视图是通过编程创建的。现在该怎么办?@Majster,在app delegate中以编程方式创建它。我确实有了另一个想法,让我们先讨论一下这个问题,如果它不好,我会在app delegate中以编程方式创建它。我将
self.viewController
设置为
UINavigationController
而不是我的当前视图控制器,并使用我的当前视图控制器初始化该导航控制器,怎么样。那么推动会起作用吗?希望您理解我的意思。@Majster您已经在示例中实例化了它。在这里简单地复制一下。@Majster,我不确定我是否理解。如果控制器层次结构以导航控制器开始,并且所有其他控制器都被推送到其堆栈上,则可以推送PinViewController。无论屏幕上是哪个控制器,这都会起作用。我不知道如果你有一些模态视图控制器,它是否能正常工作。我明白了,但我没有nib文件,视图是通过编程创建的。现在该怎么办?@Majster,在app delegate中以编程方式创建它。我确实有了另一个想法,让我们先讨论一下这个问题,如果它不好,我会在app delegate中以编程方式创建它。我将
self.viewController
设置为
UINavigationController
而不是我的当前视图控制器,并使用我的当前视图控制器初始化该导航控制器,怎么样。那么推动会起作用吗?希望您理解我的意思。@Majster您已经在示例中实例化了它。在这里简单地复制一下。@Majster,我不确定我是否理解。如果控制器层次结构以导航控制器开始,并且所有其他控制器都被推送到其堆栈上,则可以推送PinViewController。无论屏幕上是哪个控制器,这都会起作用。我不知道如果你有一些模态视图控制器,它是否能正常工作。@Majster,我有完全相同的想法。在我写下这个答案后,我看到了你的评论,但我认为它仍然可以接受。是的,似乎我在某个地方犯了一个错误,确实创建了一个导航控制器,但按下按钮不起作用。不再重要了,我已经在应用程序代理中创建了视图。看起来确实有点乱,但哦,好吧。。。谢谢,很好,对你有用。如果你喜欢,向上投票也没什么坏处:)@Majster我也有同样的想法。在我写下这个答案后,我看到了你的评论,但我认为它仍然可以接受。是的,似乎我在某个地方犯了一个错误,确实创建了一个导航控制器,但按下按钮不起作用。不再重要了,我已经在应用程序代理中创建了视图。看起来确实有点乱,但哦,好吧。。。谢谢,很好,对你有用。不过,如果你喜欢,向上投票也不会有什么坏处:)