使用标识符执行 segue 在 swift 2 中不起作用

Posted

技术标签:

【中文标题】使用标识符执行 segue 在 swift 2 中不起作用【英文标题】:perform segue with identifier wont work in swift 2 【发布时间】:2015-08-31 11:12:02 【问题描述】:

当用户登录应用程序时,我一直在使用此代码执行自定义 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 的选项 你是如何创建转场的? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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会怎样?【参考方案3】:

如果您的 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)。无论如何,这个答案解决了问题【参考方案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会怎样

以上是关于使用标识符执行 segue 在 swift 2 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

VC 之间的 Swift Segue 没有任何联系

Swift SearchResultsController Segue - “接收者......没有标识符'testSeg''的segue”

如果 segue.identifier == "showChildFiles" 当 segue 标识符看起来正确时,Swift 3 准备 segue 不通过

如何在 Swift 中通过 Segue 将数据传递到下一个视图?

如何从标签栏控制器执行 show segue?

swift 3 prepare(for segue:) 功能坏了? [复制]