【问题标题】:Attempt to present controller whose view is not in the hierarchy尝试呈现视图不在层次结构中的控制器
【发布时间】:2016-02-17 16:54:39
【问题描述】:

我正在尝试完成我认为很常见的一组步骤:

当我的应用启动时,在导航控制器中加载主控制器:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window.rootViewController = UINavigationController(rootViewController: HomeViewController())
    window.makeKeyAndVisible()
    self.window = window
    return true
}

当我的应用加载时,检查用户是否登录。如果没有,请提供一个注册视图控制器:

func applicationDidBecomeActive(application: UIApplication) {
    if ref.loggedIn != nil {
        // user authenticated
        print(ref.userData)
    } else {
        // No user is signed in
        let registerViewController = RegisterViewController()
        if let navController = window?.rootViewController as? UINavigationController {
            navController.presentViewController(registerViewController, animated: true, completion: nil)
        }
    }
}

在我的 RegisterViewController 中,提供一个切换到 LoginViewController 的按钮:

@IBAction func login(sender: UIButton) {
        print("LOGIN")
        let loginViewController = LoginViewController()
        // How do I present the view controller here?
    }

我的问题是:如何显示 LoginViewController 以便调用 self.dismissViewControllerAnimated(false, completion: nil) 将返回到我的 HomeViewController?

我尝试过的事情:

  • 如果我从RegisterViewController 调用self.presentViewController,则关闭返回到RegisterViewController 而不是HomeViewController
  • 如果我尝试通过UIApplication.sharedApplication() 获取对rootViewController 的引用并在rootViewController 上显示登录控制器,那么我会收到错误“尝试在...上显示...其视图不在窗口层次结构中!”

谢谢!

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    很明显,您会收到错误“尝试在...上呈现...,其视图不在窗口层次结构中!”

    首先,您需要使用故事板标识符创建 ViewController 的实例。

    请试试这个:-

    let storyboard = UIStoryboard(name: "YourStoryboardName", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("viewControllerToBePresented") as! UIViewController //use your class name here to cast it.
    self.presentViewController(vc, animated: true, completion: nil)
    

    编辑

    在您的情况下,您可以在注册屏幕上使用协议,这将获得 在主屏幕上实现。

    在该实现中,您可以编写代码来关闭寄存器视图 然后呈现登录视图。

    【讨论】:

    • 我使用的是 xib 文件,而不是使用情节提要。我已经有一个视图控制器的实例。我可以从 RegisterViewController 调用 self.presentViewController ,但这会在注册视图控制器而不是 HomeViewController 之上显示视图。
    • @EricConner 如果您展示的是 RegisterViewController,那么它将仅展示在注册视图控制器之上。
    • 这是有道理的。有没有办法可以将 LoginViewController 与 RegisterViewController 交换,以便它出现在 HomeViewController 之上?还是有其他方法可以做到这一点?
    • 你能告诉我你的屏幕层次结构吗?可能是和图像解释您的屏幕层次结构
    【解决方案2】:

    如果您尝试呈现一个新的视图控制器,请将该视图控制器添加到导航控制器中,然后呈现该导航控制器。 从呈现的视图控制器中,您可以关闭到以前的视图控制器。 我希望这会奏效..

    【讨论】:

      【解决方案3】:

      在您的情况下,您可以在注册屏幕上使用协议,该协议将在主屏幕上实现。

      在该实现中,您可以编写代码来关闭注册视图,然后显示登录视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        相关资源
        最近更新 更多