eonr
eonr

Reputation: 29

Receive delegate method in different class

I'm developing a music player by using Jukebox 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?

First Screenshot is first ViewController which has delegates methods and initialize player.

MainViewController I need to reach that delegate methods in secondViewController to update the UI.

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: { () -> 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)")
}

Upvotes: 0

Views: 172

Answers (1)

Ramesh.G
Ramesh.G

Reputation: 359

If you want to use music playerview from anywhere

  1. you should write player class all code for playing files should be in this and just need to pass array of list from anywhere and it can played.and use custom delegation for appropriate response in playerview

  2. for UI make a viewcontroller and u can show it from any class so you can call from anywhere in the app

Upvotes: 2

Related Questions