Я пытаюсь использовать CADisplayLink
для обновления UIProgressView
. Вот подпись инициализации CADisplayLink
Вот сводка соответствующих переменных из класса 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
}
}
Когда я инициализирую updater
в методе play()
, компилятор говорит:
Аргумент
#selector
относится к методу экземпляраupdateSlider(sender:)
, который не предоставляется Objective-C.
Достаточно просто ... добавьте objc
перед func updateSlider(sender: AudioPlayer)
, например:
@objc func updateSlider(sender: AudioPlayer)
Ошибка компилятора исчезнет на наносекунду, затем в только что обновленной строке написано:
@objc можно использовать только с членами классов, протоколами @objc и конкретными расширениями классов.
Есть несколько ответов по этой теме, но я не нашел ни одного, который работал бы.
Я попытался добавить updateSlider
в расширение, а не в раздел протокола, но я продолжаю получать этот пинг-понг о том, что компилятор хочет добавить @objc
впереди, а затем удалить его.
Я также попытался использовать для этого экземпляр класса Timer
вместо класса CADisplayLink
, но столкнулся с той же проблемой.
Спасибо за чтение. Я приветствую ваши предложения.
delegate
, а для селектора -#selector(AudioPlayerDelegate.updateSlider(sender:))
. Вам также, вероятно, следует развернуть свой делегат, прежде чем передавать его по ссылке отображения, но я не знаю, что на самом деле делает этот метод, если вы передадите его nil. - person dan   schedule 30.05.2017