Я слежу за учебником, чтобы добавить пользовательские переходы, написанные для Swift 2 :, но мои пользовательские переходы не заменяют существующие.Изменить на UIViewControllerTransitioningDelegate определение для Swift 3 предотвращает переход
ответ
Для Swift 3 действительно важно использовать animationController(forPresented:
вместо animationControllerForPresented (
в определении вашего делегата.
extension DataViewController: UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return PresentMenuAnimator() //your replacement
}
}
В противном случае ваш предложенный аниматор просто проигнорируется.
Это не отмечено кодом автозамены в Xcode.
Эта проблема вызвана Swift 3 renamification. В частности, у Clang Importer возникают проблемы с дополнительными методами протокола: компилятор не всегда совпадает с вашей старой декларацией с новой, переименованной декларацией. Таким образом, ваш метод становится бесполезной функцией, которая никогда не будет вызвана: вы не получаете предупреждения от компилятора о проблеме, потому что метод, который вы не смогли реализовать правильно, является необязательным, но во время выполнения Objective-C не видит вашего объявленную функцию как метод, который он ищет, поэтому он не вызывает его.
Вот несколько советов, которые я разработал для замечать и решать эту проблему:
Всегда сделать ваше заявление в расширении явно принятия протокола. Компилятор будет , конечно, не увидит ваши методы, если вы этого не сделаете. (Я рассматриваю это как ошибку в Swift и подал ее.)
Поместите выделение внутри имени функции и посмотрите на инспектора быстрой справки справа. Если вы не видите справки - то есть, если все, что вы видите, является объявлением вашей функции, вы не соответствовали функции делегата правильно.
Посмотрите на документы! В этом случае https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate показывает переименованные подписи. Так же и заголовки: просто нажав кнопку «UIViewControllerTransitioningDelegate», вы бы показали их вам.
Если у вас есть сомнения, придерживайтесь Objective-C имени метода перед вашим с атрибутом
@objc(...)
. Это позволяет Objective-C видеть ваш метод. Это временная остановка, но, по крайней мере, она заставит ваш код работать снова.
Если компилятор не отметил, что ваши сигнатуры методов были неправильными (для Swift 3), вы должны подать отчет об ошибке. – matt
Я буду делать это –