Инициализатор для условной привязки должен иметь необязательный тип, а не «UIView».

Из исследования 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 }

person Laurence Wingo    schedule 29.06.2016    source источник
comment
какая ошибка показывается?   -  person Ulli H    schedule 29.06.2016


Ответы (2)


transitionContext.containerView() был изменен, чтобы возвращать необязательное значение, поэтому вы не можете использовать его для инициализации переменной в условной привязке, такой как guard или if let.

Вы должны удалить guard из этой строки:

let containerView = transitionContext.containerView()
person dan    schedule 29.06.2016
comment
Спасибо. Теперь он работает после удаления этого фрагмента кода из условия защиты. - person Farrakh Javed; 04.11.2016
comment
С предложенной выше строкой я получаю еще одну ошибку: Невозможно вызвать значение нефункционального типа UIView; fix-it: Удалить () Есть идеи? - person tylerSF; 02.04.2017

Контейнерное представление, в котором происходит презентация. Это предок как представлений представления, так и представлений контроллера представлений.

Этот containerView передается контроллеру анимации и возвращает необязательный

ПРИМЕЧАНИЕ:

if let/if var необязательное связывание работает только тогда, когда результат правой части выражения является необязательным. Если результат правой стороны не является необязательным, вы не можете использовать эту необязательную привязку. Смысл этой необязательной привязки состоит в том, чтобы проверить наличие нуля и использовать переменную только в том случае, если она не равна нулю.

person Ashish    schedule 04.05.2017