2013-08-30 95 views
1

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

问题是我不知道如何在当前活动的任何视图控制器上显示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上完成。

回答

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]; 
} 

如果您的应用程序委托厦门国际银行的的文件的所有者,那么你就可以连接你的视图中的应用程序的委托需要的任何网点。

+0

我明白了,但我没有nib文件,视图是以编程方式创建的。现在做什么? – Majster

+0

@Majster,只需在应用程序委托中以编程方式创建它即可。 – rdelmar

+0

我确实得到了另一个想法,让我们首先讨论这个问题,如果它的坏病在程序委托中以编程方式进行。我如何将'self.viewController'设置为'UINavigationController'而不是我当前的''''并且使用我当前的视图控制器来初始化那个navController。然后会推动工作?希望你明白我的意思。 – Majster

0

您可以以他们提及的here的方式呈现PIN视图控制器。

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

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

希望这有助于!

2

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

@Majster我有完全相同的想法。我在写这个答案后看到了你的评论,但认为它仍然可以接受。 – allprog

+0

是的,看起来我在某个地方犯了一个错误,确实创建了一个导航控制器,但推动没有奏效。无所谓我已经在应用程序委托中创建了视图。它看起来有点混乱,但噢,好吧......谢谢。 – Majster

+0

这很好,它为你工作。 upvoting不伤害,虽然如果你喜欢它:) – allprog