Segue崩溃了我的程序。与我的NavigationController和我的TabBarViewController有关

时间:2014-08-08 07:18:16

标签: objective-c uinavigationcontroller swift uistoryboard uistoryboardsegue

我在测试我的应用时遇到了问题。您可以在下图中看到我如何设置我的视图:

My StoryBoard setup

事情就是一切正常。我使用我的测试用户登录,以下代码执行loginSegue,

self.performSegueWithIdentifier("loginSegue", sender: self)

这是一个模态segue,它将我的登录“View Controller”与“Home Tab Bar View Controller”相关联。我被重定向到“初始Feed视图控制器”。一切都很好。但是当我转到我的“设置视图控制器”,然后单击“注销”按钮,其中包含以下代码(IBAction):

@IBAction func logoutAction(sender: AnyObject) {

  PFUser.logOut()

  self.performSegueWithIdentifier("logoutSegue", sender: self)
}

我的应用崩溃了。我的Logout按钮的动作有一个segue,它会将你带回登录“View Controller”,但会先将用户记录下来(顺便说一下,我正在使用Parse)。这个“推”segue称为logoutSegue。我试图将segue改为“Popover”segue。这解决了问题,有点,因为这样做会弄乱我的“注册视图控制器”,因为在登录“视图控制器”时,我点击“注册”按钮,应用程序无论如何都会崩溃。

编译器告诉我,以下代码行是导致错误的代码:

self.performSegueWithIdentifier("logoutSegue", sender: self)

我不明白为什么会这样。我想它与我的“导航控制器”和“主页标签栏视图控制器”设置有关。或者也许与代表们合作?

你可以帮我解决这个问题吗?如果您使用Objective-C方法并不重要,请随意提出解决方案,我可以尝试将其从Objective-C转换为Swift。

除了帮我解决问题之外,我想知道你是否知道Segue类型(Push,Modal,Popover,Replace)之间的区别是什么,以及我何时应该使用它们。我阅读了Apple的文档,但我仍然完全不理解它。

提前感谢您的建议和回应。

1 个答案:

答案 0 :(得分:5)

您不想使用传统的segue返回登录屏幕。普通的segue类型始终会创建目标视图控制器的新副本。相反,您希望将控制权返回给调用您的视图控制器。

您需要在注销时设置展开segue 。这是怎么回事。

1)在ViewController的代码中添加此功能:

@IBAction func comeHereOnLogout(segue:UIStoryboardSegue) {
    println("Yay, Logged Out!")
}

2)从view controller顶部的Settings View Controller图标进行控制拖动 exit顶部的Settings View Controller图标,然后从显示的弹出框中选择comeHereOnLogout

enter image description here


enter image description here


文档大纲中选择该segue,并在属性检查器中为其指定标识符,例如“logoutSegue”。

enter image description here


enter image description here

然后您可以在代码中使用以下命令触发此segue:

self.performSegueWithIdentifier("logoutSegue", sender: self)

3)或者,您可以将退出按钮中的unwind segue连接到exit顶部的Settings View Controller图标。在这种情况下,此segue将替换您的注销按钮操作。同样,你想给这个segue一个名字,比如“logoutSegue”。

enter image description here


在这种情况下,您需要将注销码放入准备segue:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "logoutSegue" {
        PFUser.logOut()
    }
}