Custom Segue in Swift

前端 未结 4 599
感动是毒
感动是毒 2020-12-15 07:41
@objc(SEPushNoAnimationSegue)
class SEPushNoAnimationSegue: UIStoryboardSegue {
    override func perform () {
      self.sourceViewController.navigationController.p         


        
4条回答
  •  执笔经年
    2020-12-15 08:14

    Issue #1

    UIStoryboardSegue has an irritating flaw: its sourceViewController and destinationViewController properties are typed as AnyObject! (that's the case even in Objective-C (Id type)) and not as UIViewController, as it should be.

    That same flaw creates havoc in your perfect and simple code. Here's how to rewrite it in order to fix the compile errors:

    @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)
        }
    }
    

    NOTE: Apple fixed this thing in iOS 9. sourceViewController and destinationViewController are now correctly declared as UIViewController.

    Issue #2

    The Swift compiler stores its symbols using its own name mangling, and good ol' Objective-C does not recognize it in Xcode. Using an explicit @obj() solves the issue.

提交回复
热议问题