从AppDelegate执行segue

时间:2017-09-12 14:18:21

标签: ios swift appdelegate

当用户在后台离开应用程序超过三分钟时,我需要从AppDelegate执行segue。 这是我的代码:

func applicationWillEnterForeground(_ application: UIApplication) {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    let preferences = UserDefaults.standard
    let time_in = preferences.object(forKey: "time_background") as! Date
    let timenow = Date().addingTimeInterval(-3*60) as Date
    if time_in <= timenow {
        print("timeout")
        //transition to the login
    }
    print(preferences.object(forKey: "session_time") ?? "test")
}

所以在 //转换到登录我希望segue将用户带回登录页面。

但我不明白如何从AppDelegate做一个segue。

4 个答案:

答案 0 :(得分:1)

我不认为尝试使用segue是正确的方法。首先,您需要获取显示的当前根视图控制器,并将登录视图控制器推送到堆栈。

我认为您最好的选择是将根视图控制器设置为登录视图控制器,然后在用户进行身份验证时将根视图控制器设置为应用程序的导航控制器。这将重置视图层次结构/堆栈,并将防止内存问题,隐藏按钮,以便用户不能只跳过登录VC等

在我的应用程序中,我有两个自定义导航控制器。一个用于与身份验证相关的vc,另一个用于主应用程序。我只需在需要时替换window.rootViewController

在我的AppDelegate中我有

self.window = UIWindow(frame: UIScreen.main.bounds)

if authenticationManager.authenticated() {
    self.initialiseMainStack()
} else {
    self.initialiseAuthenticationStack()
}

self.window?.makeKeyAndVisible()

然后稍晚一点文件..

func initialiseMainStack() {
    let nav = UINavigationController()
    let vc = MainViewController()
    nav.setViewControllers([vc])
    self.window.rootViewController = nav
}

func initialiseAuthenticationStack() {
    let nav = UINavigationController()
    let vc = AuthViewController()
    nav.setViewControllers([vc])
    self.window.rootViewController = nav
}

答案 1 :(得分:1)

func showLoginScreen(){
    let loginVC = UIStoryboard.getMainStoryboard().instantiateViewController(withIdentifier: "LoginViewControllerIdentifier") as! LoginViewController

    UIApplication.shared.delegate!.window!!.rootViewController = loginVC     
}

extension UIStoryboard{
    //returns storyboard from default bundle if bundle paased as nil.
    public class func getMainStoryboard() -> UIStoryboard{
        return UIStoryboard(name: "Main", bundle: nil)
    }
}

答案 2 :(得分:0)

您可以保存对当前显示的viewcontroller的引用,并在该引用上执行segue。

或者您可以将window替换为LoginViewController

window?.rootViewController = loginViewController

答案 3 :(得分:0)

我不知道你的app结构有多难,但是你可以创建一个观察者并向每个相关的实例化viewcontroller发送通知,你可以从那里导航用户登录屏幕。