StackOverflowの調査から、このエラーはオプションではないタイプをバインドしようとしたことが原因であることがわかりましたが、代わりにガードを使用しているため、この状況では意味がありません。これが私のコードです:
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 }
transitionContext.containerView()
はオプションではないものを返すように変更されたため、guard
やif let
のような条件付きバインディングで変数を初期化するために使用することはできません。
その行からguard
を削除する必要があります。
let containerView = transitionContext.containerView()
プレゼンテーションが行われるコンテナビュー。これは、提示されたビューコントローラーのビューと提示されたビューコントローラーのビューの両方の祖先です。
このcontainerViewはアニメーションコントローラーに渡されており、オプションではないものが返されます
注意:
if let/if varオプションのバインディングは、式の右側の結果がオプションの場合にのみ機能します。右側の結果がオプションでない場合、このオプションのバインディングを使用することはできません。このオプションのバインディングのポイントは、nilをチェックし、nil以外の場合にのみ変数を使用することです。