2016-06-29 45 views
9

StackOverflow üzerindeki araştırmadan, bu hatanın isteğe bağlı olmayan bir türe bağlanmaya çalışılmasından kaynaklandığını öğrendim, ancak bu konuda anlamlı değil durum yerine koruma kullandı.Koşullu ciltleme için başlatıcı, 'UIView' değil, 'UIView' olmalıdır

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 bu hat üzerinde bir hata göstermek: İşte benim kod bir koşullu bir değişkeni başlatmak için kullanamaz böylece

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

hangi hata gösteriliyor? –

cevap

10

transitionContext.containerView(), isteğe bağlı olmayan bir dönüş değiştirildi Bir guard veya if let gibi bağlanma.

O hattan guard kaldırması gerekir:

let containerView = transitionContext.containerView() 
+0

Teşekkürler. Şimdi bu kod parçasını koruma koşulundan çıkardıktan sonra çalışıyor. –

+0

Yukarıdaki satırda başka bir hata alıyorum, "İşlevsiz tip UIView değerini çağıramıyor; düzeltme yap: Sil()" Herhangi bir fikir mi? – tylerSF

2

bir sunum meydana geldiği konteyner görünümü. Hem sunum hem de sunulan kontrolörün görüşlerinin atasıdır.

Bu containerView animasyon kontrolöre geçirilmediğini ve bir isteğe bağlı olmayan

NOT dönmek var

:

var ihtiyari bağlayıcı sadece ifade sağ tarafında sonucu/olup çalışır izin verseydim ne zaman eğer isteğe bağlı. Sağ tarafın sonucu isteğe bağlı değilse, bu isteğe bağlı bağlamayı kullanamazsınız. Bu isteğe bağlı bağlamanın amacı, sıfır olup olmadığını denetlemek ve yalnızca değişkenini sıfır değilse de kullanmaktır.