显示来自 AppDelegate 的两个 ViewController

Show two ViewController from AppDelegate

APP 启动时 - 启动 SigninView - 没问题。接下来如果成功 - 我需要 showTripController()。功能正常但没有任何显示?有什么问题吗?

func showSigninView() {
    let controller = self.window?.rootViewController!.storyboard?.instantiateViewControllerWithIdentifier("DRVAuthorizationViewController")
    self.window?.rootViewController!.presentViewController(controller!, animated: true, completion: nil)
}

func showTripController() {
    let cv = self.window?.rootViewController!.storyboard?.instantiateViewControllerWithIdentifier("DRVTripTableViewController")
    let nc = UINavigationController()
    self.window?.rootViewController!.presentViewController(nc, animated:true, completion: nil)
    nc.pushViewController(cv!, animated: true);
}

首先你必须在使用 window 之前添加这个:

self.window.makeKeyAndVisible()

另一件要记住的事情是:

有时 keyWindow 可能已被 window 替换为 nil rootViewController(在 iPhone 上显示 UIAlertViews、UIActionSheets 等),在这种情况下,您应该使用 UIView 的 window 属性.

所以,不要使用 rootViewController,而是使用它提供的最上面的那个:

extension UIApplication {
    class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return topViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return topViewController(base: presented)
        }
        return base
    }
}

if let topController = UIApplication.topViewController() {
    topController.presentViewController(vc, animated: true, completion: nil)
}

替换 showTripController 的最后 3 行如下:

let nc = UINavigationController(rootViewController: cv));
self.window!.rootViewController = nc