2016-06-12 6 views
2

Я хочу, чтобы протокол наследовал от протокола Apple UIViewControllerTransitioningDelegate, добавлял дополнительные требования к протоколу и предоставлял реализацию по умолчанию для некоторых методов в этом протоколе. Когда я это делаю, методы не вызываются. Когда я реализую методы в самом классе, вызываются методы do.Методы расширения протокола не вызываются, когда протокол расширяет существующий протокол API Apple

Вот что я говорю:

class FirstViewController: UIViewController, SlideDismissor { 
    let transition: PercentDrivenInteractiveTransitionWithState? = PercentDrivenInteractiveTransitionWithState() 
} 

protocol SlideDismissor: UIViewControllerTransitioningDelegate { 
    var transition: PercentDrivenInteractiveTransitionWithState? { get } 
} 

extension SlideDismissor { 
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return nil // I do return something here, but for this example it isn't necessary 
    } 

    func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 
     return transition 
    } 
} 

Если добавить следующий код в функции не вызываются.

extension FirstViewController: UIViewControllerTransitioningDelegate { 

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return nil // I do return something here, but for this example it isn't necessary 
    } 

    func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 
     return transition 
    } 

} 

Эти методы, которые я пытаюсь предоставить для реализации по умолчанию, являются необязательными.

+0

I также испытал ту же самую вещь, пытающуюся обеспечить реализацию по умолчанию для 'UIView ControllerTransitioningDelegate' – Mingming

ответ

1

У меня была такая же проблема, что и попытка сделать что-то подобное. По-видимому, текущее ограничение расширений протокола похоже на то, что мы не можем предоставить стандартные реализации протоколов Objective-C. Таким образом, любой протокол, объявленный в UIKit, попадает под эту категорию. Также сообщается о рекомендуемом article о программно-ориентированном программировании. это справедливо по состоянию на сентябрь 2016 года Я чувствую вашу боль = (но я думаю, сейчас это уборщик расширение подход на самом деле не представляется возможным в настоящее время

2

Лучшее решение для такого рода проблем является использование композиции, а чем наследование. Вместо того, чтобы соответствовать SlideDismissor, делегировать одному.

(я не проверял этот код или даже убедитесь, что оно компилирует, но это основной подход, который я бы исследовать.)

class FirstViewController: UIViewController { 

    // Rather than handle your own transitioning, delegate it to another, reusable, object.  
    override func viewDidLoad() { 
     // Your original protocol suggested that the view controller wanted 
     // to control what kind of transition was used, so we pass it as a paramater. 
     transitioningDelegate = SlideDismissor(transition: PercentDrivenInteractiveTransitionWithState()) 
    } 
} 

// In that object, implement all the delegate methods 
class SlideDismissor: NSObject, UIViewControllerTransitioningDelegate { 
    let transition: PercentDrivenInteractiveTransitionWithState? 

    init(transition: PercentDrivenInteractiveTransitionWithState?) { 
     self.transition = transition 
    } 

    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return nil // I do return something here, but for this example it isn't necessary 
    } 

    func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 
     return transition 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^