我正在努力完成我认为非常常见的一系列步骤:
当我的应用程序启动时,在导航控制器中加载一个家庭控制器:
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 ...其视图不在窗口层次结构!" 谢谢!
答案 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视图。