【问题标题】:perform segue with identifier wont work in swift 2使用标识符执行 segue 在 swift 2 中不起作用
【发布时间】:2018-09-13 19:09:05
【问题描述】:

当用户登录应用程序时,我一直在使用此代码执行自定义 segue:

dispatch_async(dispatch_get_main_queue()){

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

}

我的 perpareForSegue 目前有这段代码(我不完全确定我是否需要它)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
            if "showSTPS" == segue.identifier {
                }
}

每次我尝试执行 segue 时都会收到以下错误:

2015-08-31 11:56:28.998 ICEFLO[3858:651041] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法使用标识符“showSTPS”执行 segue。 segue 必须有一个 performHandler 或者它必须覆盖 -perform。'

任何关于如何做的建议将不胜感激 - 请注意这是针对 swift2/ios9

-瑜伽士

【问题讨论】:

  • 请发布您的自定义 segue 子类的代码
  • 自定义segue绝对没有代码,我设置为custom的唯一原因是我们不能使用push。
  • 自定义转场适用于使用自定义动画的转场 - 请参阅本教程 appcoda.com/custom-segue-animations
  • Irrelevent.. 问题是我不能以编程方式执行 segue。由于某些奇怪的原因,我也没有使用 show 的选项
  • 你是如何创建转场的?

标签: ios iphone swift2


【解决方案1】:

确保在您的故事板中,segue 类型未设置为自定义。如果您将其设置为自定义,则需要提供您自己的自定义 segue 类。

【讨论】:

    【解决方案2】:

    如果您的 segue 设置为“自定义”,您需要覆盖 perform 方法。你可以关注this example

    基本上创建一个继承自 UIStoryboardSegue 的类,像这样:

    MyCustomSegue.h

    @interface MyCustomSegue : UIStoryboardSegue
    @end
    

    MyCustomSegue.m

    @implementation MyCustomSegue
    - (void) perform {
        UIViewController *src = (UIViewController *) self.sourceViewController;
        UIViewController *dst = (UIViewController *) self.destinationViewController;
    
        [src.navigationController pushViewController:dst animated:YES];
    }
    @end
    

    我认为这段代码对你有用。

    【讨论】:

    • OP 要求 swift 2 解决方案 -1
    • 此解决方案修复了他遇到的确切错误。一旦我实现了答案,我将添加一个 swift2 改编版(我目前仅使用 objC)。无论如何,这个答案解决了问题
    【解决方案3】:

    Swift 版本:

    class CustomSegue: UIStoryboardSegue {
        override func perform() {
    
            let src = self.sourceViewController
            let dst = self.destinationViewController
            src.navigationController?.pushViewController(dst, animated: true)
        }
    }
    

    【讨论】:

    • 只是添加到这个答案:请注意,您不要在此方法中调用 super.perform(),否则尽管覆盖了该方法,但您将收到与 OP 相同的运行时错误。
    • @ThomasVerbeek 你是说我们应该打电话给super.perform() 还是不应该?答案仍然包括它。
    • @TashPemhiwa 我是说你不应该致电super.perform()。我已经提交了修改:)
    • 如果我们不使用navigationController会怎样?
    【解决方案4】:

    不要调用超级...

    class CustomSegue: UIStoryboardSegue {
    
        override func perform() {
            // super.perform() NOOO or crash!
            let src = self.sourceViewController
            let dst = self.destinationViewController
            src.navigationController?.pushViewController(dst, animated: true)
        }
    
    }
    

    【讨论】:

    • 如果我们不使用navigationController会怎样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多