如何使用导航控制器调用视图控制器

Posted

技术标签:

【中文标题】如何使用导航控制器调用视图控制器【英文标题】:how to call view controller with navigation controller 【发布时间】:2016-04-26 10:36:21 【问题描述】:

我有一个名为 login VC 的视图控制器和导航视图控制器。我在我的 LoginVc 中连接了两个按钮。第一个按钮将导航到注册屏幕作为推送序列。第二个按钮将导航到忘记密码屏幕作为推送序列。

现在,当用户登录并进入我的应用程序时。有一个名为注销的按钮名称。我已经编写了代码功能,例如,当用户按下注销按钮时,一个 uialert 弹出窗口会询问“你想要注销”。如果用户按下,他们将导航到再次登录屏幕。

所以在用户按下注销后,如果用户进入登录屏幕,如果用户按下我的两个按钮 [ i. e表示忘记密码屏幕,注册屏幕按钮]。然后我崩溃了。

崩溃报告:

Terminating app due to uncaught exception 'NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController.'

我的注销按钮代码:

@IBAction func LogoutButton(sender: AnyObject) 

    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "ISLOGGEDIN")

    NSUserDefaults.standardUserDefaults().synchronize()

    dispatch_async(dispatch_get_main_queue(), 


        let alert = UIAlertController(title: "Logout Successful", message: "You have successfully logged out.", preferredStyle: UIAlertControllerStyle.Alert)

        // add an action (button)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default)action -> Void in

            let loginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as? LoginViewController




            let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

            appDelegate.window?.rootViewController = loginViewController


            )

        // show the alert
        self.presentViewController(alert, animated: true, completion: nil)

    )





我尝试添加这一行:

let vc: UINavigationController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as! UINavigationController

但我遇到了同样的问题。现在如何在注销按钮操作方法中重新编写代码。使用导航栏重定向到登录屏幕。

请帮帮我。谢谢!

【问题讨论】:

【参考方案1】:

您正在将 RootViewController 设置为 ViewController,但您的应用程序是 NavigationViewController。您的 RootViewController 应该是 NavigationController。因此,将您的 LoginViewController 添加到 NavigationViewController 并设置窗口的 rootViewController。

let loginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as? LoginViewController
let navigationController = UINavigationController(rootViewController: vc)
window.rootViewController = navigationController

【讨论】:

【参考方案2】:

你为什么不这样做:

self.navigationController?.pushViewController(loginViewController!, animated: true)

当你想回来时:

self.navigationController?.popViewControllerAnimated(true)

【讨论】:

看看这个教程:code.tutsplus.com/tutorials/… 您能否发布一些示例代码,这些代码将使用我的登录屏幕与导航控制器进行导航 在上面的答案中,查看教程了解这个逻辑。【参考方案3】:

根据您的错误,在您的视图层次结构中找不到导航控制器。

从故事板和Editorembed inNavigation controller 中选择您的 loginViewController。并使用performSegue 推送视图控制器并使用popViewControllerpopTorootviewcontroller 返回导航控制器。

希望这会有所帮助:)

【讨论】:

【参考方案4】:
    点击查看storyBoard中的控制器 转到编辑器 -> 嵌入 -> 导航控制器,这将在此视图控制器上添加导航。 然后您可以从一个视图控制器推送和弹出到另一个视图控制器。

例如:推送

var dash : XyzViewController = storyBoard.instantiateViewControllerWithIdentifier("xyz") as! XyzViewController
self.navigationController?.pushViewController(dash, animated: true)

流行音乐

self.navigationController?.popViewControllerAnimated(true)

【讨论】:

以上是关于如何使用导航控制器调用视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

swift3如何显示导航视图控制器

如何将参数传递给导航控制器内的弹出视图控制器

如何找出属于当前 viewController 的导航控制器?

调用控制器和方法时,导航栏图像未显示在 MVC 视图上

导航控制器内的表格视图中未调用 textFieldDidEndEditing

无法导航到根视图控制器