title: Receive delegate method in different class
body: <p>I'm developing a music player by using <a href="https://github.com/teodorpatras/Jukebox" rel="nofollow noreferrer">Jukebox</a> library. It has a delegation which warn elements when songs duration/ current time etc. changed. In Jukebox example, all of codes are in ViewController. Therefore, for example when current time changes, it also changes sliders value. I want to create a player class which is usable by more than one ViewController. When I put delegate methods inside this model class. How can I reach them in ViewController classes?</p>
  
  <p>First Screenshot is first ViewController which has delegates methods and initialize player. </p>
  
  <p><a href="https://i.stack.imgur.com/J9Jvd.png" rel="nofollow noreferrer">MainViewController</a>
  I need to reach that delegate methods in secondViewController to update the UI.</p>
  
  <pre><code>class ViewController: UIViewController, JukeboxDelegate {
  
  var jukebox : Jukebox!
  
  override func viewDidLoad() {
      super.viewDidLoad()
      configureUI()
  
      // begin receiving remote events
      UIApplication.shared.beginReceivingRemoteControlEvents()
  
      // configure jukebox
      jukebox = Jukebox(delegate: self, items: [
          JukeboxItem(URL: URL(string: "http://www.kissfm.ro/listen.pls")!),
          JukeboxItem(URL: URL(string: "http://www.noiseaddicts.com/samples_1w72b820/2514.mp3")!),
          JukeboxItem(URL: URL(string: "http://www.noiseaddicts.com/samples_1w72b820/2958.mp3")!)
          ])!
  }
  // MARK:- JukeboxDelegate -
  
  func jukeboxDidLoadItem(_ jukebox: Jukebox, item: JukeboxItem) {
      print("Jukebox did load: \(item.URL.lastPathComponent)")
  }
  
  func jukeboxPlaybackProgressDidChange(_ jukebox: Jukebox) {
  
      if let currentTime = jukebox.currentItem?.currentTime, let duration = jukebox.currentItem?.meta.duration {
          let value = Float(currentTime / duration)
          slider.value = value
          populateLabelWithTime(currentTimeLabel, time: currentTime)
          populateLabelWithTime(durationLabel, time: duration)
      } else {
          resetUI()
      }
  }
  
  func jukeboxStateDidChange(_ jukebox: Jukebox) {
  
      UIView.animate(withDuration: 0.3, animations: { () -&gt; Void in
          self.indicator.alpha = jukebox.state == .loading ? 1 : 0
          self.playPauseButton.alpha = jukebox.state == .loading ? 0 : 1
          self.playPauseButton.isEnabled = jukebox.state == .loading ? false : true
      })
  
      if jukebox.state == .ready {
          playPauseButton.setImage(UIImage(named: "playBtn"), for: UIControlState())
      } else if jukebox.state == .loading  {
          playPauseButton.setImage(UIImage(named: "pauseBtn"), for: UIControlState())
      } else {
          volumeSlider.value = jukebox.volume
          let imageName: String
          switch jukebox.state {
          case .playing, .loading:
              imageName = "pauseBtn"
          case .paused, .failed, .ready:
              imageName = "playBtn"
          }
          playPauseButton.setImage(UIImage(named: imageName), for: UIControlState())
      }
  
      print("Jukebox state changed to \(jukebox.state)")
  }
  
  func jukeboxDidUpdateMetadata(_ jukebox: Jukebox, forItem: JukeboxItem) {
      print("Item updated:\n\(forItem)")
  }
  </code></pre>