Swift - 调用自定义委托方法

时间:2017-06-21 23:55:26

标签: ios swift delegates swift-protocols swift-extensions

我正在使用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)
    }
}

我正在扩展BMPlayerControlView类以使用以下代码扩展控件视图。

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

    }
}

这似乎不起作用,我在这里缺少什么?

感谢。

1 个答案:

答案 0 :(得分:1)

如果您希望 的<{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可确保您在尝试执行此操作时收到错误消息。