条件绑定的初始化程序必须具有可选类型,而不是“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()
已更改为返回非可选值,因此您不能使用它来初始化条件绑定中的变量,例如 guard
或 if let
。
您应该从该行中删除 guard
:
let containerView = transitionContext.containerView()
【讨论】:
谢谢。从保护条件中删除这段代码后,它现在可以工作了。 根据上面的建议行,我得到另一个错误,“无法调用非函数类型 UIView 的值;修复它:Delete ()”有什么想法吗?【参考方案2】:进行演示的容器视图。它是呈现和呈现视图控制器的视图的祖先。
这个 containerView 被传递给动画控制器,它返回一个非可选的
注意:
if let/if var 可选绑定仅在表达式右侧的结果是可选的情况下才有效。如果右侧的结果不是可选的,则不能使用此可选绑定。这个可选绑定的重点是检查 nil 并且仅在变量为非 nil 时才使用它。
【讨论】:
以上是关于条件绑定的初始化程序必须具有可选类型,而不是“UIView”的主要内容,如果未能解决你的问题,请参考以下文章
如何修复条件绑定的初始化程序必须具有可选类型,而不是“字符串”? [复制]
条件绑定的初始化程序必须具有可选类型,而不是“UIView”
条件绑定的初始化程序必须具有可选类型,而不是“AVAudioInputNode”
条件绑定的初始化程序必须具有可选类型,而不是“UIView”