我有一个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上完成。
您可以让应用程序委托处理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的文件所有者,那么您可以将视图中所需的任何出口连接到应用程序代理。
如果您的根视图控制器是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];
}
您可以按照提及here的方式呈现您的PIN视图控制器。
并且为了弹出PIN视图控制器,我猜测用户必须输入正确的PIN,以便PIN视图控制器消失。在这种情况下,它可以弹出自己:
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
希望这可以帮助!
转换为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)
}