【问题标题】:Changing rootViewController doesn't display viewController set as root更改 rootViewController 不会显示 viewController 设置为 root
【发布时间】:2018-12-25 08:32:08
【问题描述】:

我有一个 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
}

这是我故事板的一部分:

这里有什么问题?

【问题讨论】:

  • 你在哪里调用setRootViewController 方法?
  • 我有一个包含几个静态方法的类,我在 initialViewController 的 willAppear 中使用“static func logoutUser()”,在 logoutUser 中调用“setRootViewController”。
  • setRootViewController 是否调用了主队列?
  • 我将 logoutUser() 调用移至 viewDidAppear 并解决了问题。

标签: ios swift rootviewcontroller


【解决方案1】:

将此函数放在您的 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)
}

【讨论】:

    【解决方案2】:

    在函数结束时使用 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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 2020-11-19
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多