iOS 自定义 Segue 不工作

Posted

技术标签:

【中文标题】iOS 自定义 Segue 不工作【英文标题】:iOS Custom Segue Not Working 【发布时间】:2014-06-22 22:40:32 【问题描述】:

我刚刚开始学习如何开发 ios 应用程序。 (请注意,我使用的是 XCode 6 beta 和 Swift)我认为我擅长自己构建接口,但我似乎遇到了 segues 问题。

我的应用程序的第一页只是一个简单的屏幕,带有一个注册按钮和一个登录按钮。我为注册页面制作了一个单独的视图控制器,并在其上放置了一个文本字段。这两个视图控制器都在我的故事板中。然后我制作了一个自定义的 segue 类来简单地为开始页面和注册页面设置动画,将一个屏幕向左移动,以便现在显示注册页面。这是我的自定义 segue 类:

class SlideFromRightSegue: UIStoryboardSegue 
    override func perform() 
        let screenWidth = UIScreen.mainScreen().bounds.width
        let center = self.sourceViewController.view!.center
        UIView.animateWithDuration(0.25,
            animations: 
                self.sourceViewController.view!.center = CGPoint(x: center.x - screenWidth, y: center.y)
                self.destinationViewController.view!.center = CGPoint(x: center.x - screenWidth, y: center.y)
            , completion:  (finished: Bool) in
                self.sourceViewController.presentViewController(self.destinationViewController as UIViewController, animated: false, completion: nil)
            )
    

我根据我找到的教程进行了此操作,我认为这里没有问题。我只是将源 VC 的中心和目标 VC 的中心设置为左侧的一个屏幕。我不完全确定动画在 iOS 中是如何工作的,但我发现的教程结构类似,所以我假设调用传递给“动画”参数的闭包,然后 iOS 生成中间的所有步骤并将每一帧绘制到屏幕。 (如果我错了,请纠正我)

所以我有一个自定义的转场。我回到我的故事板,单击注册按钮,转到连接选项卡,然后将“触发的 Segues - 动作”拖到第二个 VC,选择“自定义”,然后选择我的自定义类。出于某种原因,它不仅仅是“SlideFromRightSegue”,而是“_TtC524SlideFromRightSegue”。我不确定为什么会这样,但我认为这与我重命名了 segue 类这一事实有关,我希望这不会造成任何问题。无论如何,这样做会创建一个从第一个 VC 到第二个 VC 的箭头,所以我认为它有效。

当我运行应用程序时,我会像往常一样进入开始屏幕。我点击注册按钮,没有任何反应。可能我错过了一些东西,但我在我的 segue 的 perform() 函数中放置了一个断点,在第一个 VC 的 prepareForSegue() 函数中放置了另一个断点。一个都没有触发。我想我已经正确设置了 segue,我只是在我的应用程序中的实际实现有问题。有人知道发生了什么吗?

【问题讨论】:

我试过你的代码,虽然它不能正常工作,但它确实转换到下一个控制器。我的名字也像你的 (_TtC19SlideFromRightSegue),这似乎是 Swift 或 iOS 8 的新东西。甚至不需要你执行的事实意味着你可能在 IB 中错误地连接了一些东西。 【参考方案1】:

是的,事实证明问题在于我也使用了自定义按钮类,它覆盖了 touchesBegan、touchesEnded 和 touchesCancelled 函数。这些覆盖没有回调超类方法,所以按下按钮的动作甚至没有被触发。

我想我可以从中吸取的教训是确保知道哪些函数覆盖必须回调超类,哪些应该完全覆盖超类。触摸事件处理程序可能需要回调超类。

【讨论】:

【参考方案2】:

我不知道为什么没有调用您的 perform 方法,但这不是由于您的代码,尽管代码确实存在一些问题。您永远不会将目标视图控制器的视图添加到窗口(直到演示文稿为您完成此操作)。因此,您需要添加视图,将其置于屏幕右侧,然后使其居中,而不是像您在代码中那样离开屏幕左侧,

class SlideFromRightSegue: UIStoryboardSegue 

    override func perform() 
        let screenWidth = UIScreen.mainScreen().bounds.width
        let center = self.sourceViewController.view!.center
        let appdel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        appdel.window!.addSubview(self.destinationViewController.view)
        self.destinationViewController.view!.center = CGPoint(x: center.x + screenWidth, y: center.y)

        UIView.animateWithDuration(0.25,
            animations: 
                self.sourceViewController.view!.center = CGPoint(x: center.x - screenWidth, y: center.y)
                self.destinationViewController.view!.center = center
            , completion:  (finished: Bool) in
                self.sourceViewController.presentViewController(self.destinationViewController as UIViewController, animated: false, completion: nil)
                self.sourceViewController.view!.removeFromSuperview() 
            )
    

【讨论】:

谢谢!我刚刚发现了我的特殊问题,但后来你帮我节省了时间 在调用 source.presentViewController 之前是否需要从窗口中删除目标控制器,或者该函数是否知道 VC 何时已经是窗口的一部分? @jchitel,不,当我记录窗口的子视图时,只有 2 个源视图和目标视图(没有两个目标视图)。不过,您应该删除源视图。我已将其添加到我的答案中。 我将添加一个 unwind segue 以返回。我将能够使用第一个视图控制器的相同实例,对吗? @jchitel,是的,在演示之后,源视图控制器仍然是窗口的根视图控制器(如果要开始的话)。即使不是,呈现的控制器也有一个指向它的强指针。

以上是关于iOS 自定义 Segue 不工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 自定义 segue 内存泄漏

自定义 UITableViewController 单元格 segue 不推送

iOS中的自定义segue

IOS / Objective-C / Storyboard:从左到右的自定义Segue在视图控制器之间创建黑条

如何从自定义 UITableViewCell 触发 segue - iOS7

IOS/Objective-C:在没有 Storyboard Segue 的情况下可以在模态转换中使用自定义 Segue?