如何在 SWIFT 中进入前台时显示 Lock_ViewController?

How to present Lock_ViewController when app is entering foreground in SWIFT?

请帮帮我。我有一个具有密码锁定功能的应用程序,每次用户打开该应用程序时都会激活该功能。如果用户回到家(应用程序转到后台)然后返回应用程序(前台)我想再次显示锁定屏幕(或使用其他 viewcontroller )。我该怎么做?

我知道 appDelegate 中的 WillEnterForeground,我只是不知道如何让我的应用程序显示锁定屏幕而不是进入后台之前的屏幕。

此应用与照片库应用非常相似。照片由锁屏保护,每次打开应用程序时都会询问用户密码

非常感谢您

有几个库可用

https://github.com/antiraum/THPinViewController

https://github.com/D-32/DMPasscode

https://github.com/tiny2n/JKLLockScreenViewController

如果你想自己做或在实现它的过程中,请在 willEnterForground 方法中获取最顶层的控制器,在该控制器上显示你的锁屏控制器,在成功的 pin 检查后关闭你的锁屏控制器,如果你需要通知别人,推送通知 这就是你如何获得最顶级的控制器

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
     if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
     } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
     } else if (rootViewController.presentedViewController) {
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
     } else {
        return rootViewController;
    }
}

Swift

func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController! {

    if rootViewController.isKindOfClass(UITabBarController) {
        let tabbarController =  rootViewController as! UITabBarController
        return self.topViewControllerWithRootViewController(tabbarController.selectedViewController)
    }else if (rootViewController.isKindOfClass(UINavigationController)) {
        let navigationController = rootViewController as! UINavigationController
        return self.topViewControllerWithRootViewController(navigationController.visibleViewController)
    }else if ((rootViewController.presentedViewController) != nil){
        let controller = rootViewController.presentedViewController
        return self.topViewControllerWithRootViewController(controller)
    }else {
        return rootViewController
    }

}

用法

    let topController = self.topViewControllerWithRootViewController(UIApplication.sharedApplication().delegate?.window??.rootViewController)

修改扩展或随意使用

答案补充

swift 3.0:

func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController! {

    if rootViewController is UITabBarController {
        let tabbarController =  rootViewController as! UITabBarController
        return self.topViewControllerWithRootViewController(rootViewController: tabbarController.selectedViewController)
    } else if rootViewController is UINavigationController {
        let navigationController = rootViewController as! UINavigationController
        return self.topViewControllerWithRootViewController(rootViewController: navigationController.visibleViewController)
    } else if ((rootViewController.presentedViewController) != nil){
        let controller = rootViewController.presentedViewController
        return self.topViewControllerWithRootViewController(rootViewController: controller)
    } else {
        return rootViewController
    }

}

用法:

let topController = self.topViewControllerWithRootViewController(rootViewController: UIApplication.shared.delegate?.window??.rootViewController)

答案补充

Swift 4(带扩展名)

在您的应用委托中 -

// Show the pin view controller when app becomes active
func applicationDidBecomeActive(_ application: UIApplication) {

    if shouldAskForPin {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let loginVC = storyboard.instantiateViewController(withIdentifier: "PinViewController")
        let topVC = self.window?.rootViewController?.topViewController()
        topVC!.present(loginVC, animated: true, completion: nil)
    }
}

如果应用程序在图钉视图显示时进入后台,当应用程序再次激活时,图钉视图控制器将再次添加到它上面,依此类推。所以辞职的时候把它去掉。确保在 PIN 视图控制器的故事板中(或通过代码)设置了恢复标识符。

func applicationWillResignActive(_ application: UIApplication) {
    if shouldAskForPin {
        let topVC = self.window?.rootViewController?.topViewController()
        if topVC!.restorationIdentifier == "PinViewController" {
            topVC!.dismiss(animated: false, completion: nil)
        }
    }
}

最后,根据上述答案使其工作的扩展。通常最好放在一个单独的文件中,例如UIViewController+Extension.swift

import UIKit

extension UIViewController {

    func topViewController() -> UIViewController! {
        if self.isKind(of: UITabBarController.self) {
            let tabbarController =  self as! UITabBarController
            return tabbarController.selectedViewController!.topViewController()
        } else if (self.isKind(of: UINavigationController.self)) {
            let navigationController = self as! UINavigationController
            return navigationController.visibleViewController!.topViewController()
        } else if ((self.presentedViewController) != nil){
            let controller = self.presentedViewController
            return controller!.topViewController()
        } else {
            return self
        }
    }

}