Swift中的自定义Segue

问题描述

第1期

UIStoryboardSegue有一个令人烦恼的缺陷:它的sourceViewController和destinationViewController属性的键入方式为AnyObject!(即使在Objective-C(Id类型)中也是如此),而不是UIViewController应该的方式。

相同的缺陷会给您的完美和简单的代码造成破坏。这是重写它的方法,以修复编译错误:

@objc(SEPushNoAnimationSegue)
class SEPushNoAnimationSegue: UIStoryboardSegue {
    override func perform () {
        let src = self.sourceViewController as UIViewController
        let dst = self.destinationViewController as UIViewController
        src.navigationController.pushViewController(dst, animated:false)
    }
}

注:苹果在iOS中9固定这个东西sourceViewControllerdestinationViewController现在被正确声明为UIViewController

第2期

Swift编译器使用其自己的名称mangling来存储其符号,并且很好的,Objective- C在Xcode中无法识别它。使用显式即可@obj()解决问题。

解决方法

@objc(SEPushNoAnimationSegue)
class SEPushNoAnimationSegue: UIStoryboardSegue {
    override func perform () {
      self.sourceViewController.navigationController.pushViewController(self.destinationViewController,animated:false)
    }
}

在上面的代码中,我有2个问题:1)。它具有编译错误:’UINavigationController!’ 没有名为“
pushViewController”的成员

但是在该类中,确实有一个pushViewController方法。

2)。我必须添加注释:@objc(SEPushNoAnimationSegue),否则,在情节提要中,它只能识别随机生成的名称,例如_tcxxxxSEPushNoAnimationSegue。

为什么这两个问题在这里发生?

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...