swiftswift4swift-protocolsavplayerviewcontroller

IOS Swift Protocol is not working or hitting breakpoint


I created a question a few days ago and was provided with protocol on how to solve an issue of passing data back and forth . I have also looked at some tutorials and have created a protocol but it is not working or even hitting the breakpoint from what I can see it should be working. I have created a protocol for my AVPlayer so that on tap it could get a new video but like i said it's not even hitting the breakpoint this is my code...

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
            }

    }
  }

Now This is my second class/controller

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



}

As I stated before it is not even hitting the breakpoint on BookViewC.reloadTabled as suggestions would be great


Solution

  • You have the foundation set up correctly but remember that classes are (mostly) just blueprints for instances. These classes are useless until you create instances of them because it’s the instances that will do the work.

    Therefore, simply pass one instance as the delegate of the other, which you can do here because you've correctly set up the protocol.

    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
    

    Where you do this instantiation/delegation is up to you. Also, I know that a lot of people here use class to define protocols that only conform to classes, but Swift's documentation instructs us to use AnyObject.