在app delegate中添加的视图控制器未显示

时间:2022-05-14 15:00:31
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    let auth: UIViewController =
        storyBoard.instantiateViewController(withIdentifier: "Auth") as UIViewController

    window?.rootViewController?.present(auth, animated: true, completion: nil)

    return true
}

I get the error...

我收到错误......

Warning: Attempt to present on whose view is not in the window hierarchy!

警告:尝试显示其视图不在窗口层次结构中!

I presume the root controller has not been properly configured at this point in the app life cycle.

我认为在应用程序生命周期中此时尚未正确配置根控制器。

How do I do this? I want to avoid having the root controller having to check whether it needs to show the login screen.

我该怎么做呢?我想避免让根控制器检查是否需要显示登录屏幕。

2 个解决方案

#1


1  

You can do it like that:

你可以这样做:

func application(_ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if Settings.appSettings.authToken != nil {
        self.showMainController()
    }
    NotificationCenter.default.addObserver(forName: .authorizationOperationDidSuccess,
        object: nil, queue: nil) { (notification) in
        self.showMainController()
    }

    return true
}

private func showMainController() {
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    let controller: UIViewController =
        storyBoard.instantiateViewController(withIdentifier: "Main") as UIViewController
    if self.window == nil {
        self.window = UIWindow(frame: UIScreen.main.bounds)
    }
    self.window?.backgroundColor = UIColor.white
    self.window?.rootViewController = controller
    self.window?.makeKeyAndVisible()
}

private func showAuthorizationController() {
        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    let controller: UIViewController =
        storyBoard.instantiateViewController(withIdentifier: "Auth") as UIViewController
    if self.window == nil {
        self.window = UIWindow(frame: UIScreen.main.bounds)
    }
    self.window?.backgroundColor = UIColor.white
    self.window?.rootViewController = controller
    self.window?.makeKeyAndVisible()
}

On successful login make

成功登录后

NotificationCenter.default.post(name: .authorizationOperationDidSuccess,
                    object: nil)

#2


0  

Make change here,

在这里改变,

let auth: AuthVC =  storyBoard.instantiateViewController(withIdentifier: "Auth") as AuthVC

// AuthVC is your_VC_name

Still facing issue, you can ask.

仍然面临问题,你可以问。

#1


1  

You can do it like that:

你可以这样做:

func application(_ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    if Settings.appSettings.authToken != nil {
        self.showMainController()
    }
    NotificationCenter.default.addObserver(forName: .authorizationOperationDidSuccess,
        object: nil, queue: nil) { (notification) in
        self.showMainController()
    }

    return true
}

private func showMainController() {
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    let controller: UIViewController =
        storyBoard.instantiateViewController(withIdentifier: "Main") as UIViewController
    if self.window == nil {
        self.window = UIWindow(frame: UIScreen.main.bounds)
    }
    self.window?.backgroundColor = UIColor.white
    self.window?.rootViewController = controller
    self.window?.makeKeyAndVisible()
}

private func showAuthorizationController() {
        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

    let controller: UIViewController =
        storyBoard.instantiateViewController(withIdentifier: "Auth") as UIViewController
    if self.window == nil {
        self.window = UIWindow(frame: UIScreen.main.bounds)
    }
    self.window?.backgroundColor = UIColor.white
    self.window?.rootViewController = controller
    self.window?.makeKeyAndVisible()
}

On successful login make

成功登录后

NotificationCenter.default.post(name: .authorizationOperationDidSuccess,
                    object: nil)

#2


0  

Make change here,

在这里改变,

let auth: AuthVC =  storyBoard.instantiateViewController(withIdentifier: "Auth") as AuthVC

// AuthVC is your_VC_name

Still facing issue, you can ask.

仍然面临问题,你可以问。