【问题标题】:Segue crashes my program. Has something to do with my NavigationController and my TabBarViewControllerSegue 使我的程序崩溃。与我的 NavigationController 和 TabBarViewController 有关
【发布时间】:2014-10-01 14:33:24
【问题描述】:

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

问题是一切正常。我用我的测试用户登录,下面的代码执行loginSegue,

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

这是一个模态序列,将我的登录“视图控制器”与“主页选项卡栏视图控制器”链接起来。我被重定向到“初始提要视图控制器”。一切都很好。但是当我去我的“设置视图控制器”,然后点击注销按钮,它有以下代码(IBAction):

@IBAction func logoutAction(sender: AnyObject) {

  PFUser.logOut()

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

我的应用程序崩溃了。我的注销按钮的操作有一个转场,可将您带回登录“视图控制器”,但首先将用户注销(顺便说一下,我正在使用 Parse)。这种“Push”segue 称为 logoutSegue。我试图将 segue 更改为“Popover”segue。这解决了这个问题,有点,因为这样做会弄乱我的“注册视图控制器”,因为在登录“视图控制器”时,我单击“注册”按钮并且应用程序无论如何都会崩溃。

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

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

我不明白为什么会这样。我想这与我如何设置“导航控制器”和“主页选项卡栏视图控制器”有关。或者也许与代表一起?

你能帮我解决这个问题吗?如果您有 Objective-C 方法,请随时提出解决方案,我可以尝试将其从 Objective-C 转换为 Swift。

除了帮助我解决我的问题之外,我想知道您是否知道 Segue 类型(推送、模态、弹出框、替换)之间的区别以及我应该何时使用它们。我阅读了 Apple 的文档,但我仍然不完全理解它。

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

【问题讨论】:

    标签: objective-c uinavigationcontroller swift uistoryboard uistoryboardsegue


    【解决方案1】:

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

    您需要在注销时设置 unwind segue。方法如下。

    1) 在ViewController的代码中添加这个函数:

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

    2) 按住 Control 并从 Settings View Controller 顶部的 view controller 图标拖动到 Settings View Controller 顶部的 exit 图标,然后从出现的弹出窗口中选择 comeHereOnLogout



    Document Outline 中选择该 segue,并在 Attributes Inspector 中为其指定一个 Identifier,例如“logoutSegue”。


    然后你可以在代码中触发这个segue:

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

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


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

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

    【讨论】:

    • push segueNavigation Controllers 一起使用,将另一个视图控制器推入堆栈。 Modal Segues 用于当您需要转换到一个新的视图控制器时,您将从中返回。您不会堆叠模态转换。它就在那里和回来。 Popover segues 用于 iPad 上的弹出窗口。 replace segue 我没用过所以不确定。
    • 感谢您如此详细的解释。它确实奏效了。所以你是说每次我创建一个 push segue 时,它​​都会将该视图放入视图堆栈中?该堆栈响应?我想导航控制器绑定到?所以我通过使用模态segue(因为它是另一个视图控制器)从loginSegue转换到Home Tab Bar View Controller(Tab 1)做正确的事情我想知道如果你知道任何涵盖的教程这种材料,因为Apple的文档对我来说有点复杂。再次感谢您的回复!
    • 导航控制器维护着一堆视图控制器。当您推送一个新的视图控制器时,它会为您提供一个后退按钮以将该视图控制器从堆栈中弹出。我建议在 iTunesU 上观看斯坦福 iOS 编程课程。确保您观看 2013 年秋季的最新一期,因为它涵盖了 iOS 7。它很棒,并且很好地涵盖了这些材料。 raywenderlich.com 上也有非常好的教程。
    • 非常感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多