一尘不染

Swift中的自定义Segue

swift

@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。

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


阅读 299

收藏
2020-07-07

共1个答案

一尘不染

第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()解决问题。

2020-07-07