2017-06-21 3 views
2

J'utilise BMPlayer bibliothèque et que vous souhaitez mettre en œuvre le contrôle personnalisé, pour que j'ai la classe suivante qui confirme à suivre le protocoleSwift - Invoke personnalisé délégué Méthode

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

J'étends la classe BMPlayerControlView pour étendre la vue de commande en utilisant le code suivant.

class BMPlayerCustomControlStyle3: BMPlayerControlView { 

} 

class BMPlayerStyle3: BMPlayer { 

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

Ma question est, comment puis-je appeler didPressButton méthode déléguée? Je ne semble pas écraser onButtonPressed, j'ai essayé les suivantes

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

    } 
} 

Et cela ne veut pas travailler, ce que je manque ici?

Merci.

+0

essayez de mettre 'super.controlView (controlView: controlView, didPressButton button)' dans votre méthode substituée. Faites-moi savoir si cela ne fonctionne pas. –

Répondre

1

Si vous voulez que votre BMPlayerControlView sous-classe également agir comme l'objet délégué, vous devez définir la propriété delegate ainsi (et sont conformes au protocole BMPlayerControlViewDelegate que vous faites déjà).

Une façon de le faire est par primordial la delegate superclasse dans votre propriété sous-classe:

class BMPlayerCustomControlStyle3: BMPlayerControlView { 

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

Bien sûr, lors de l'utilisation du délégué interne comme celui-ci, vous ne serez pas permettre de être utilisé par BMPlayerControlView clients du tout. Le set surchargé vous assure que vous obtenez une erreur si vous essayez de le faire.

+0

@IbrahimAzharArmar Vous * devez * encore garder cette 'extension BMPlayerCustomControlStyle3: BMPlayerControlViewDelegate..' autour ainsi;) –

+0

Vous avez raison Paulo, j'ai manqué cela, et quand j'ai ajouté il me donne une autre erreur qui dit' Erreur fatale: Délégué pour usage interne seulement! ' –

+0

@IbrahimAzharArmar Commenter l'instruction'/* fatalError ... */'pour l'instant ... –