条件绑定的初始化程序必须具有可选类型,而不是“UIView”

Posted

技术标签:

【中文标题】条件绑定的初始化程序必须具有可选类型,而不是“UIView”【英文标题】:Initializer for conditional binding must have Optional type, not 'UIView' 【发布时间】:2016-06-29 17:50:00 【问题描述】:

通过对 *** 的研究,我了解到此错误是由于尝试绑定非可选类型引起的,但在这种情况下它没有意义,因为它使用了保护。这是我的代码:

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 在这一行显示错误:

guard let containerView = transitionContext.containerView() else  return 

【问题讨论】:

显示哪个错误? 【参考方案1】:

transitionContext.containerView() 已更改为返回非可选值,因此您不能使用它来初始化条件绑定中的变量,例如 guardif let

您应该从该行中删除 guard

let containerView = transitionContext.containerView()

【讨论】:

谢谢。从保护条件中删除这段代码后,它现在可以工作了。 根据上面的建议行,我得到另一个错误,“无法调用非函数类型 UIView 的值;修复它:Delete ()”有什么想法吗?【参考方案2】:

进行演示的容器视图。它是呈现和呈现视图控制器的视图的祖先。

这个 containerView 被传递给动画控制器,它返回一个非可选的

注意:

if let/if var 可选绑定仅在表达式右侧的结果是可选的情况下才有效。如果右侧的结果不是可选的,则不能使用此可选绑定。这个可选绑定的重点是检查 nil 并且仅在变量为非 nil 时才使用它。

【讨论】:

以上是关于条件绑定的初始化程序必须具有可选类型,而不是“UIView”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复条件绑定的初始化程序必须具有可选类型,而不是“字符串”? [复制]

条件绑定的初始化程序必须具有可选类型,而不是“UIView”

条件绑定的初始化程序必须具有可选类型,而不是“AVAudioInputNode”

条件绑定的初始化程序必须具有可选类型,而不是“UIView”

收到此错误:条件绑定的初始化程序必须具有可选类型,而不是“布尔”

Swift - 条件绑定的初始化程序必须具有可选类型,而不是 'PHFetchResult<PHAsset>'