Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过AudioPlayer上的委托方法更新UIProgressView_Ios_Swift_Timer_Avaudioplayer_Cadisplaylink - Fatal编程技术网

Ios 通过AudioPlayer上的委托方法更新UIProgressView

Ios 通过AudioPlayer上的委托方法更新UIProgressView,ios,swift,timer,avaudioplayer,cadisplaylink,Ios,Swift,Timer,Avaudioplayer,Cadisplaylink,我正在尝试。这是 下面是MyAudioPlayer类中相关变量的摘要 protocol AudioPlayerDelegate: class { func updateSlider(sender: AudioPlayer) } class AudioPlayer: NSObject { // relevant vars var updater: CADisplayLink? weak var delegate: AudioPlayerDelegate?

我正在尝试。这是

下面是
MyAudioPlayer
类中相关变量的摘要

protocol AudioPlayerDelegate: class {
    func updateSlider(sender: AudioPlayer)
}

class AudioPlayer: NSObject {
    // relevant vars
    var updater: CADisplayLink?
    weak var delegate: AudioPlayerDelegate?

    func play() {
        // some setup stuff

        updater = CADisplayLink(target: self, selector: #selector(delegate?.updateSlider(sender:)))

        // regular stuff to play an audio file
    }
}
当我在
play()
方法中初始化
updater
时,编译器说:

#selector
的参数引用实例方法
updateSlider(发送者:)
不暴露于Objective-C

很简单…在
func updateSlider(发送方:AudioPlayer)
前面添加
objc
,如下所示:

@objc func updateSlider(sender: AudioPlayer)
编译器错误消失了一纳秒,然后我刚刚更新的行显示:

@objc只能与类、@objc协议和类的成员一起使用 类的具体扩展

有,但我还没有找到一个有效的

我尝试在扩展中而不是在协议部分中抛出
updateSlider
,但是我一直得到编译器想要在前面添加
@objc
,然后想要删除它的乒乓球

我还尝试使用
Timer
类的实例而不是
CADisplayLink
类来执行此操作,但我遇到了相同的问题

谢谢你的阅读。我欢迎你的建议。

可以这样解决:)


丹让我在这个问题上越过了终点线。我需要在协议声明前面添加
@objc
,而不是在我的委托方法前面添加
@objc

// First change
@objc protocol AudioPlayerDelegate: class {
    @objc func updateSlider(sender: AudioPlayer)
}
AudioPlayer
类中的下一步

// Delegate declaration
weak var delegate: AudioPlayerDelegate?

// Second Change
if let delegate = delegate {
    updater = CADisplayLink(target: delegate, selector: #selector(AudioPlayerDelegate.updateSlider(sender:)))
    updater?.preferredFramesPerSecond = 30
    updater?.add(to: RunLoop.current, forMode: .commonModes)
}
最后,当使用
更新程序时,使其无效并将其置零(最有可能的方式是使用任何停止AVAudioPlayer实例的方法)

    updater?.invalidate()
    updater = nil

协议需要标记为@objc,而不是其中的方法。此外,显示链接的目标应该是
委托
,选择器应该是
#选择器(AudioPlayerDelegate.updateSlider(发送方:))
。在将委托传递给显示链接之前,您可能也应该先将其展开,但如果将其传递给nil,我不知道该方法实际上会做什么。就是这样。我展开了委托并初始化了CADisplayLink,但声明协议objc让我越过了终点线。我只是声明了该方法。以answe的形式发布r申请您的25。:)
    updater?.invalidate()
    updater = nil