Custom Segue in Swift

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


        
相关标签:
4条回答
  • 2020-12-15 08:01

    This works fine for me

    @objc(SEPushNoAnimationSegue) class SEPushNoAnimationSegue: UIStoryboardSegue {
    
    override func perform() {
        let sourceViewController = self.sourceViewController as UIViewController
        let destinationViewController = self.destinationViewController as UIViewController
    
        sourceViewController.presentViewController(destinationViewController, animated: true, completion: nil)
    }
    
    }
    
    0 讨论(0)
  • 2020-12-15 08:08

    Even Better:

    import UIKit
    
    class CustomSegue: UIStoryboardSegue {
        override func perform() {
            self.sourceViewController.presentViewController(self.destinationViewController as UIViewController, animated: false, completion: nil)
        }
    }
    
    0 讨论(0)
  • 2020-12-15 08:12

    Swift 3.0:

    import UIKit
    
    class CustomNoAnimationSegue: UIStoryboardSegue {
    
        override func perform() {
            if let navigation = source.navigationController {
                navigation.pushViewController(destination, animated: false)
            }
        }
    }
    
    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题