2017-06-21 18 views
2

私は制御ビューを拡張するためにBMPlayerControlViewクラスを拡張していますBMPlayerライブラリを使用してカスタムコントロールを実装したい、私は次のプロトコルスウィフト - 呼び出しカスタム委任方法

@objc public protocol BMPlayerControlViewDelegate: class { 
    func controlView(controlView: BMPlayerControlView, didChooseDefition index: Int) 
    func controlView(controlView: BMPlayerControlView, didPressButton button: UIButton) 
    func controlView(controlView: BMPlayerControlView, slider: UISlider, onSliderEvent event: UIControlEvents) 
    @objc optional func controlView(controlView: BMPlayerControlView, didChangeVideoPlaybackRate rate: Float) 
} 

open class BMPlayerControlView: UIView { 
    open weak var delegate: BMPlayerControlViewDelegate? 
    open weak var player: BMPlayer? 

    // Removed rest of the code for clarity 

    open func onButtonPressed(_ button: UIButton) { 
     autoFadeOutControlViewWithAnimation() 
     if let type = ButtonType(rawValue: button.tag) { 
      switch type { 
      case .play, .replay: 
       if playerLastState == .playedToTheEnd { 
        hidePlayToTheEndView() 
       } 
      default: 
       break 
      } 
     } 
     delegate?.controlView(controlView: self, didPressButton: button) 
    } 
} 

に確認して次のクラスを持っているのです次のコードを使用します。

class BMPlayerCustomControlStyle3: BMPlayerControlView { 

} 

class BMPlayerStyle3: BMPlayer { 

    class override func storyBoardCustomControl() -> BMPlayerControlView? { 
     return BMPlayerCustomControlStyle3() 
    } 
} 

私の質問は、どうすればdidPressButton代理人メソッドを呼び出すのですか?私はonButtonPressedを上書きしたくない、私は

extension BMPlayerCustomControlStyle3:BMPlayerControlViewDelegate { 

    func controlView(controlView: BMPlayerControlView, didChooseDefition index: Int) { 

    } 

    func controlView(controlView: BMPlayerControlView, didPressButton button: UIButton) { 
     print("Did Press Button Invoked") 
    } 

    func controlView(controlView: BMPlayerControlView, slider: UISlider, onSliderEvent event: UIControlEvents) { 

    } 
} 

次しようと、これは私がここで何をしないのです、動作するようには思えないのですか?

ありがとうございました。

+0

オーバーライドされたメソッドに 'super.controlView(controlView:controlView、didPressButton button)'を入れてみてください。それがうまくいかない場合は私に教えてください。 –

答えて

1

デリゲートオブジェクトとしても行為にごBMPlayerControlViewサブクラスをしたい場合は、あなたにもdelegateプロパティを設定する(そして、あなたがすでにやっているようBMPlayerControlViewDelegateプロトコルに準拠)する必要があります。そうする

一つの方法は、あなたのサブクラスでdelegateスーパークラスプロパティをオーバーライドである:もちろん

class BMPlayerCustomControlStyle3: BMPlayerControlView { 

    override open weak var delegate: BMPlayerControlViewDelegate? { 
     get { return self } 
     set { /* fatalError("Delegate for internal use only!") */ } 
    } 
} 

、このような内部的にデリゲートを使用しているとき、あなたが、それはすることはできませんBMPlayerControlViewクライアントで使用されることがあります。上記のオーバーライドされたsetは、そうしようとするとエラーが発生することを保証します。

+0

@IbrahimAzharArmarあなたは正しいですが、拡張子BMPlayerCustomControlStyle3:BMPlayerControlViewDelegate..'を周りに置く必要があります。 –

+0

あなたは正解です。私はそれを逃してしまいました。追加したとき、私には '致命的なエラー: ' –

+0

@IbrahimAzharArmar今は '/ * fatalError ... * /'ステートメントをコメントアウトしています... –