尝试显示视图不在层次结构

时间:2016-02-17 16:54:39

标签: ios swift

我正在努力完成我认为非常常见的一系列步骤:

当我的应用程序启动时,在导航控制器中加载一个家庭控制器:

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?

我尝试的事情:

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

谢谢!

3 个答案:

答案 0 :(得分:0)

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

首先,您需要使用storyboard标识符创建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)
  

修改

     

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

     

在该实现中,您可以编写代码来解除寄存器视图   然后显示登录视图。

答案 1 :(得分:0)

如果您要尝试呈现新的视图控制器,请在导航控制器中添加该视图控制器,然后显示导航控制器。 从显示的视图控制器中,您可以忽略前一个视图控制器。 我希望这会有效..

答案 2 :(得分:0)

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

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

相关问题