2016-09-01 6 views

ответ

7

Для Swift 3 действительно важно использовать animationController(forPresented: вместо animationControllerForPresented ( в определении вашего делегата.

extension DataViewController: UIViewControllerTransitioningDelegate { 
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
      return PresentMenuAnimator() //your replacement 
    } 
} 

В противном случае ваш предложенный аниматор просто проигнорируется.

Это не отмечено кодом автозамены в Xcode.

+0

Если компилятор не отметил, что ваши сигнатуры методов были неправильными (для Swift 3), вы должны подать отчет об ошибке. – matt

+0

Я буду делать это –

1

Эта проблема вызвана Swift 3 renamification. В частности, у Clang Importer возникают проблемы с дополнительными методами протокола: компилятор не всегда совпадает с вашей старой декларацией с новой, переименованной декларацией. Таким образом, ваш метод становится бесполезной функцией, которая никогда не будет вызвана: вы не получаете предупреждения от компилятора о проблеме, потому что метод, который вы не смогли реализовать правильно, является необязательным, но во время выполнения Objective-C не видит вашего объявленную функцию как метод, который он ищет, поэтому он не вызывает его.

Вот несколько советов, которые я разработал для замечать и решать эту проблему:

  • Всегда сделать ваше заявление в расширении явно принятия протокола. Компилятор будет , конечно, не увидит ваши методы, если вы этого не сделаете. (Я рассматриваю это как ошибку в Swift и подал ее.)

  • Поместите выделение внутри имени функции и посмотрите на инспектора быстрой справки справа. Если вы не видите справки - то есть, если все, что вы видите, является объявлением вашей функции, вы не соответствовали функции делегата правильно.

  • Посмотрите на документы! В этом случае https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate показывает переименованные подписи. Так же и заголовки: просто нажав кнопку «UIViewControllerTransitioningDelegate», вы бы показали их вам.

  • Если у вас есть сомнения, придерживайтесь Objective-C имени метода перед вашим с атрибутом @objc(...). Это позволяет Objective-C видеть ваш метод. Это временная остановка, но, по крайней мере, она заставит ваш код работать снова.