0

我有一个 initialViewController,如果我找到用户登录信息,我会将用户路由到 Home,但如果没有,我将注册/登录 ViewController 设置为 root。我测试了我的注册/登录 ViewController didLoad 和 didAppear 执行的断点,但是我的注册/登录 ViewController 没有显示并且 initialViewController 保留在屏幕上。这是我的代码:

public static func setRootViewController(withId id: String, storyBoardName: String) {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
    let newRootVC = mainStoryboard.instantiateViewController(withIdentifier: id)
    appDelegateRef.window!.rootViewController = newRootVC
}

这是我故事板的一部分:

我的故事板的一部分

这里有什么问题?

4

2 回答 2

0

将此函数放在您的 AppDelegate 类中。您可以从视图控制器中的任何位置调用此函数。

class AppDelegate: UIResponder, UIApplicationDelegate {
    // ...

    public func present(viewController: UIViewController) {
        guard let window = window else { return }
        UIView.transition(with: window, duration: 0.5, options: .transitionFlipFromLeft, animations: {
            window.rootViewController = viewController
        }, completion: nil)
    }
}

在您希望用户注销的视图控制器中,以这种方式调用上面的函数:

public static func setRootViewController(withId id: String, storyBoardName: String) {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
    let newRootVC = mainStoryboard.instantiateViewController(withIdentifier: id)

    guard let delegate = UIApplication.shared.delegate as? AppDelegate else { return }
    delegate.present(viewController: newRootVC)
}
于 2018-12-25T09:25:41.610 回答
0

在函数结束时使用 appDelegateRef.window!.makeKeyAndVisible()

public static func setRootViewController(withId id: String, storyBoardName: String) {
    let mainStoryboard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
    let newRootVC = mainStoryboard.instantiateViewController(withIdentifier: id)
    appDelegateRef.window!.rootViewController = newRootVC
    appDelegateRef.window!.makeKeyAndVisible()
}
于 2018-12-25T11:08:53.840 回答