Протокол IOS Swift не работает или не достигает точки останова
Я создал вопрос несколько дней назад и получил протокол о том, как решить проблему передачи данных туда и обратно. Я также просмотрел некоторые учебные пособия и создал протокол, но он не работает и даже не достигает точки останова, что, как я вижу, должно работать. Я создал протокол для моего AVPlayer, чтобы он мог получить новое видео, но, как я уже сказал, он даже не достигает точки останова, это мой код...
protocol CustomAVPLayerProtocol: class {
func reloadTabled(at index: Int)
}
class CustomAVPLayerC: AVPlayerViewController {
var delagate: CustomAVPLayerProtocol?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.delagate?.reloadTabled(at: 1)
for touch in touches {
self.delagate?.reloadTabled(at: 1)
print("Tapped")
// When I tap the AVPlayer this print statement shows
// So I know it is coming here
}
}
}
Теперь это мой второй класс / контроллер
class BookViewC: UIViewController, CustomAVPLayerProtocol {
override func viewDidLoad() {
super.viewDidLoad()
PlayVideo(250, "url")
}
func reloadTabled(at index: Int) {
print("This protocol method does not execute or hit breakpoint")
self.PlayVideo(250, "url")
}
func PlayVideo(MediaHeight: Float, MediaURL: String) {
let movieURL = URL(string: MediaURL)
videoCapHeight.constant = CGFloat(MediaHeight)
streamsModel.playerView = AVPlayer(url: movieURL!)
streamsModel.MyAVPlayer.player = streamsModel.playerView
streamsModel.MyAVPlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill.rawValue
streamsModel.MyAVPlayer.showsPlaybackControls = false
streamsModel.MyAVPlayer.view.frame = VideoView.bounds
VideoView.addSubview(streamsModel.MyAVPlayer.view)
self.addChildViewController(streamsModel.MyAVPlayer)
streamsModel.playerView?.isMuted = false
streamsModel.MyAVPlayer.player?.play()
}
}
Как я уже говорил ранее, он даже не достигает точки останова на BookViewC.reloadTabled, так как предложения будут хорошими
3 ответа
Делегаты работают только с экземплярами (хотя вы можете манипулировать вещами, чтобы вы могли "делегировать" типам или, по крайней мере, якобы). У вас правильно настроены основы, но помните, что эти два класса являются просто чертежами для экземпляров, которые их запускают. Классы (и все типы) сами по себе ничего не делают, пока вы не создадите экземпляры этих классов; это экземпляры, которые делают всю работу.
Поэтому просто передайте один экземпляр как делегат другого, что вы можете сделать здесь, потому что вы правильно настроили протокол.
protocol CustomAVPLayerProtocol: AnyObject {
func reloadTabled(at index: Int)
}
class CustomAVPLayerC: AVPlayerViewController {
weak var delagate: CustomAVPLayerProtocol?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.delagate?.reloadTabled(at: 1)
for touch in touches {
self.delagate?.reloadTabled(at: 1)
print("Tapped")
}
}
}
class BookViewC: UIViewController, CustomAVPLayerProtocol {
override func viewDidLoad() {
super.viewDidLoad()
PlayVideo(250, "url")
}
func reloadTabled(at index: Int) {
PlayVideo(250, "url")
}
func PlayVideo(_ MediaHeight: Float, _ MediaURL: String) {
//
}
}
let book = BookViewC()
let layer = CustomAVPLayerC()
layer.delagate = book
От того, где вы это делаете, зависит от вас создание и делегирование и то, как вы хотите структурировать свою программу.
Кроме того, я знаю, что многие люди здесь используют class
определять протоколы, которые соответствуют только классам, но документация Swift предписывает нам использовать AnyObject
вместо этого, чтобы определить протоколы только для класса.
Согласно вашему коду, это несколько мелких ошибок, которые вы можете исправить, чтобы заставить его работать.
1. `weak var delagate: CustomAVPLayerProtocol?`
*Make a weak delegate to save it from retaining a strong reference cycle and memory leaks.*
2. Code Snippet:
func PlayVideo {
let customPlayer = CustomAVPLayerC()
customPlayer.delegate = self
}
в вашем втором ViewController, вам нужно назначить свой делегат контроллеру объекта / представления, чтобы он отвечал на
ПРИМЕЧАНИЕ. Если вам требуется, вы можете создать суперкласс, соответствующий вашему классу протокола, чтобы каждый контроллер представления соответствовал ему автоматически, вам просто нужно назначить делегата классу, в котором вы хотите его использовать.
Протоколы являются наиболее распространенным средством, используемым несвязанными объектами для общения друг с другом. Согласно приведенному выше коду, общение не произошло.
Ваша часть декларации протокола, кажется, в порядке. Проблема существует во втором ViewController. Я вижу, что вы не установили делегата для объекта, который был создан. В идеале это должно быть что-то вроде этого:
Class BookViewC: UIViewController, CustomAVPLayerProtocol {
override func viewDidLoad() {
super.viewDidLoad()
PlayVideo(250, "url")
}
Вам необходимо установить делегата здесь:
func PlayVideo {
let customPlayer = CustomAVPLayerC()
customPlayer.delegate = self //This makes the selector to respond
}