2017-06-21 3 views
2

I BMPlayer Bibliothek bin mit und wollen individuelle Steuerung implementieren, für die ich die folgende Klasse, dieSwift - Invoke Benutzerdefinierte Delegatmethode

@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) 
    } 
} 

Ich erstreckt BMPlayerControlView Klasse folgende Protokoll bestätigen die Steuerungssicht verlängern Verwenden Sie den folgenden Code.

class BMPlayerCustomControlStyle3: BMPlayerControlView { 

} 

class BMPlayerStyle3: BMPlayer { 

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

Meine Frage ist, wie rufe ich didPressButton Methode delegieren? Ich will nicht onButtonPressed überschrieben werden soll, habe ich versucht, die folgende

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) { 

    } 
} 

Und dieses scheint nicht zu funktionieren, was soll ich hier fehlt?

Danke.

+0

versuchen Sie, 'super.controlView (controlView: controlView, didPressButton-Schaltfläche)' in Ihrer überschriebenen Methode. Lass es mich wissen, wenn das nicht funktioniert. –

Antwort

1

Wenn Sie Ihre BMPlayerControlView Unterklasse auch fungieren als Delegatobjekt, müssen Sie auch die delegate Eigenschaft setzen (und das BMPlayerControlViewDelegate Protokoll entsprechen, wie Sie bereits tun).

Eine Möglichkeit, dies zu tun ist durch die delegate Super Eigenschaft in der Unterklasse überschreiben:

class BMPlayerCustomControlStyle3: BMPlayerControlView { 

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

Natürlich, wenn die Delegierten intern wie diese verwenden, können Sie wird es nicht lassen von BMPlayerControlView Clients überhaupt verwendet werden. Das oben beschriebene Überschreiben set stellt sicher, dass Sie einen Fehler erhalten, wenn Sie dies versuchen.

+0

@IbrahimAzharArmar Sie * müssen * immer noch diese 'Erweiterung BMPlayerCustomControlStyle3: BMPlayerControlViewDelegate..' herum ebenso;) –

+0

Sie haben Recht Paulo, ich habe das vermisst, und als ich es hinzugefügt habe, gibt es mir einen anderen Fehler, der' Fatal error sagt: Delegieren Sie nur für den internen Gebrauch! ' –

+0

@IbrahimAzharArmar Kommentieren Sie die'/* fatalError ... */'Anweisung für jetzt ... –

Verwandte Themen