@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。
为什么这两个问题在这里发生?
UIStoryboardSegue有一个令人烦恼的缺陷:它的sourceViewController和destinationViewController属性的键入方式为AnyObject!(即使在Objective-C(Id类型)中也是如此),而不是UIViewController应该的方式。
AnyObject!
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固定这个东西sourceViewController和destinationViewController现在被正确声明为UIViewController。
sourceViewController
destinationViewController
Swift编译器使用其自己的名称mangling来存储其符号,并且很好的,Objective- C在Xcode中无法识别它。使用显式即可@obj()解决问题。
@obj()