2016-06-29 5 views
9

Aus Forschung über StackOverflow habe ich gelernt, dass dieser Fehler durch den Versuch, einen Typ zu binden, der nicht optional ist, aber es macht keinen Sinn in diesem Situation, weil es stattdessen Wache verwendete. Hier ist mein Code:Initialisierer für bedingte Bindung muss optionalen Typ, nicht 'UIView'

func animateTransition(_ transitionContext: UIViewControllerContextTransitioning) { 
     // Here, we perform the animations necessary for the transition 

     guard let fromVC = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey) else { return } 
     let fromView = fromVC.view 
     guard let toVC = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey) else { return } 
     let toView = toVC.view 
     guard let containerView = transitionContext.containerView() else { return } 

     if self.presenting { 
      containerView.addSubview(toView) 
     } 

     let animatingVC = self.presenting ? toVC : fromVC 
     let animatingView = animatingVC.view 
     let appearedFrame = transitionContext.finalFrame(for: animatingVC) 

     var alpha: CGFloat = 1 
     if self.options.contains([.AlphaChange]) { 
      alpha = 0; 
     } 

     let initialAlpha = self.presenting ? alpha : 1 
     let finalAlpha = self.presenting ? 1: alpha 

     var dismissedFrame = appearedFrame 
     let startRect = CGRect(origin: appearedFrame.origin, size: containerView.bounds.size) 
     let offset = self.calculateStartPointOffset(startRect, options: self.options) 

     if options.contains([.Dissolve]) && !self.presenting { 
      dismissedFrame.size = containerView.bounds.size 
      dismissedFrame.origin = CGPointZero 
     } else { 
      dismissedFrame = CGRect(x: offset.x, y: offset.y, width: appearedFrame.width, height: appearedFrame.height) 
     } 

     let initialFrame = self.presenting ? dismissedFrame : appearedFrame 
     let finalFrame = self.presenting ? appearedFrame : dismissedFrame 
     animatingView?.frame = initialFrame 
     animatingView?.alpha = initialAlpha 
     let dumpingValue = CGFloat(self.options.contains([.Interactive]) ? 1 : 0.8) 

     UIView.animate(withDuration: self.transitionDuration(transitionContext), delay: 0, usingSpringWithDamping: dumpingValue, initialSpringVelocity: 0.2, options: [UIViewAnimationOptions.allowUserInteraction, UIViewAnimationOptions.beginFromCurrentState], 
            animations: 
      {() -> Void in 
       animatingView?.frame = finalFrame 
       animatingView?.alpha = finalAlpha 
      }) 
     { (completed) -> Void in 
       if !self.presenting { 
        fromView?.removeFromSuperview() 
        self.tDelegate?.didDissmisedPresentedViewController() 
       } 
       let cancelled = transitionContext.transitionWasCancelled() 
       transitionContext.completeTransition(!cancelled) 
     } 
    } 

Xcode zeigen einen Fehler auf dieser Linie:

guard let containerView = transitionContext.containerView() else { return } 
+0

Welcher Fehler wird angezeigt? –

Antwort

10

transitionContext.containerView() wurde geändert, um eine nicht-optional zurückzukehren, so dass Sie nicht verwenden können eine Variable in einem bedingten zu initialisieren Bindung wie ein guard oder if let.

let containerView = transitionContext.containerView() 
+0

Danke. Es funktioniert jetzt, nachdem dieser Code aus dem Schutzzustand entfernt wurde. –

+0

Mit der vorgeschlagenen Zeile oben bekomme ich einen weiteren Fehler, "Kann nicht Wert von Nicht-Funktion Typ UIView aufrufen; fix-it: Löschen()" Irgendwelche Ideen? – tylerSF

2

Der Behälter Ansicht, in der eine Präsentation stattfindet:

Sie sollten die guard aus dieser Zeile entfernen. Es ist ein Vorfahr der Ansichten des präsentierenden und des präsentierten View-Controllers.

Diese containerView wird, um die Animation Controller übergeben und es ist ein nicht optionalen

Hinweis zurück:

if/lassen, wenn var optional Bindung funktioniert nur, wenn das Ergebnis der rechten Seite des Ausdrucks ein optionales. Wenn das Ergebnis der rechten Seite nicht optional ist, können Sie diese optionale Bindung nicht verwenden. Der Punkt dieser optionalen Bindung besteht darin, auf Null zu prüfen und die Variable nur zu verwenden, wenn sie nicht null ist.