2016-10-05 4 views
4

Я пытаюсь реализовать пользовательский переход между двумя viewControllers. (Swift 3,0)Делегированные методы не называются (transitioningDelegate)

Между двумя моими viewControllers У меня есть UISegue с видом show (animated = true).

Так я поставил методы делегата от UIViewControllerTransitioningDelegate в расширении моего первого контроллера представления:

extension DocumentsViewController : UIViewControllerTransitioningDelegate { ... } 

И я также реализованы необходимые методы, с помощью протокола:

animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    ... 
} 

public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    ... 
} 

Теперь, когда segue выполняет, в firstViewController Я использую метод делегата prepareForSegue, чтобы окончательно установить transitioningDelegate на мой `secondViewController, см. Ниже:

public override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    super.prepare(for: segue, sender: sender) 
    if let destination = segue.destination as? DocumentDetailViewController { 
     destination.transitioningDelegate = self 
    } 
} 

Я проверяю с помощью контрольных точек, делегат хорошо настроен на мой firstViewController. Но методы делегата transitioningDelegate в моем первом контролере просмотра никогда не запускаются, я не знаю почему.

Любые идеи?

PS: В моей раскадровке, мой segue have Animated to true, так что это должно работать, но это не так.

Спасибо.

SOLVED: Смесь MadreDeDios, Matt и Tushar отвечает.

1: Как я хочу, чтобы сохранить навигации в моем приложении, я должен сделать соответствовать моему первому ViewController к UINavigationControllerDelegate вместо UIViewControllerTransitioningDelegate. (см. MadreDeDios ответ).

2: Согласно этому протоколу, я реализовал следующий метод делегата:

public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 

... 

} 

3: я установить делегат ранее на viewDidLoad() моего firstViewController (см ответ Мэтта) :

override public func viewDidLoad() { 
    super.viewDidLoad() 
    //... 
    self.navigationController?.delegate = self 
} 

4: Я используя ручной нажим вместо segue для отображения моего secondViewController (см. Ответ Тушара).

Теперь это работает, спасибо.

+0

Вы забыли: destination.modalPresentationStyle = .custom?. и реализовать функцию: presentationController (forPresented представлен: UIViewController, представляющий: UIViewController ?, источник: UIViewController) -> UIPresentationController? – dellos

ответ

3

Проблемы что вы устанавливаете transitioningDelegate слишком поздно. Путь слишком поздно. Он должен быть установлен очень на раннем этапе жизни контроллера вида. Я советую установить это свойство в инициализаторе контроллера вида..

1

Попробуйте удалить переход раскадровки и выполнить код вида представления вручную и явно указать «истину» для анимированного параметра:

presentViewController (documentVC, анимированный: правда, завершение: ноль)

4

Поскольку вы используете push-сегу, я предполагаю, что вы также используете навигационный контроллер.

Когда вы используете UINavigationController, он становится ссылкой для каждого перехода, анимации и даже ориентации приложения.

Моим советом было бы использовать ваш контроллер навигации в качестве менеджера для всех ваших анимаций. Все, что вам нужно сделать, это добавить эти несколько вещей.

extension MyNavigationController: UINavigationControllerDelegate { 

    func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     //Check for the good animation 
     return MyAnimation() 
    } 
} 

И внутри MyNavigationController класса

override func viewDidLoad() { 
    super.viewDidLoad() 

    //This is the key 
    self.delegate = self 

    //Only if you want to animate the presentation of your navigation controller itself, the first time it appears: 
    self.transitioningDelegate = self 
} 
Смежные вопросы