Как предотвратить повторный запуск элемента песни после выбора? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть представление коллекции, в котором есть несколько песен, и после выбора этих песен приложение перемещается в playerV C, где находится кнопка паузы и изображение песни. Если пользователь, например, выбирает песню a, запускается musi c, поэтому "player.play ()" истинно, а затем пользователь перемещается в playerV C с его изображением et c, теперь скажите, что пользователь покидает этот проигрыватель V C и хочет вернуться к нему, чтобы приостановить песню, вся песня перезапускается. Как я могу предотвратить это? Я знаю, что мне нужно реализовать оператор If, чтобы что-то сделать, это "player.isPlaying", но я не знаю, что в него вставить.

Это класс, в котором инициализируется звук

class SoundManager {
    public var position = 0
    public var songs: [Song] = []
    var player: AVAudioPlayer?    
    func playNavPlayer() {
        let song = songs[position]
        let urlString = Bundle.main.path(forResource: song.trackName, ofType: "mp3")
        do {          
            try AVAudioSession.sharedInstance().setMode(.default) ///app needs to know what mode we are working on
            try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
            guard let urlString = urlString else { return }
            player = try AVAudioPlayer(contentsOf: URL(string: urlString)!)
            guard let player = player else {return}
            player.volume = 0.5
            // player.play()
            // player.delegate = self
            player.numberOfLoops = -1
        } catch {
            print ("Error")
        }
    }    
}

Обновлен класс Singleton

 class SoundManager {
       private init(){ } 
       static let shared = SoundManager()
       public var position = 0
       public var songs: [Song] = []
       var player: AVAudioPlayer?
       var songURL: URL!
    
       func playNavPlayer() {
           let song = songs[position]
           let urlString = Bundle.main.path(forResource: song.trackName, ofType: "mp3")

           do {
            
           try AVAudioSession.sharedInstance().setMode(.default) ///app needs to know what mode we are working on
           try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)

            guard let urlString = urlString else { return }
        
            player = try AVAudioPlayer(contentsOf: URL(string: urlString)!)
        
            guard let player = player else {return}
            player.volume = 0.5
            player.play()
            //player.delegate = self
            player.numberOfLoops = -1
            
            }
         
         catch {
             print ("Error")
         }

       }

Как этот класс называется

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    collectionView.deselectItem(at: indexPath, animated: true)
      
      //present player
    let position = indexPath.item

    
    guard let vc = storyboard?.instantiateViewController(identifier: "player") as? PlayerViewController else {
          return
      }
    
            func push() {
           
            vc.songs = songs
            vc.position = position
            vc.soundManager = SoundManager.shared
            navigationController?.pushViewController(vc, animated: true)     
    }
      SoundManager.shared.songs = songs
    SoundManager.shared.position = position
    if SoundManager.shared.player?.isPlaying == true && SoundManager.shared.player?.url (This is where I need to see compare song playing with song clicked) {
        push()
    }
    else {
        SoundManager.shared.playNavPlayer()
        push()
    }
    SoundManager.shared.setupRemoteTransportControls()
    SoundManager.shared.setupNowPlaying()
    
    //songs
    
 }

Объявление песни

 
         var songs = [Song]()

         func configureSongs() {
        
          songs.append(Song(name: "Empire", imageName: "cover1", trackName: "Empire"))
          songs.append(Song(name: "FirstSample", imageName: "cover2", trackName: "FirstSample"))
          songs.append(Song(name: "TBH", imageName: "cover3", trackName: "TBH"))
          songs.append(Song(name: "Trials", imageName: "cover4", trackName: "Trials"))
          songs.append(Song(name: "Magic Spells", imageName: "cover5", trackName: "MagicSpells"))
          songs.append(Song(name: "Still Goin", imageName: "cover6", trackName: "StillGoin"))
        
     }
   Song, is a struct
     import Foundation


      struct Song {
    
         let name: String
         let imageName: String
         let trackName: String
     }

1 Ответ

0 голосов
/ 11 августа 2020

Таким образом, структура Song должна соответствовать протоколу Equatable, чтобы мы могли использовать функцию, в которой мы сравниваем два экземпляра нашей структуры Song, например,

    struct Song: Equatable {
    
         let name: String
         let imageName: String
         let trackName: String
         static func == (lhs: Self, rhs: Self) -> Bool {
         return lhs.trackName == rhs.trackName
    }
     }

А затем, когда мы выбираем песню (item) в didSelect мы реализуем функцию if для проверки того, играет ли игрок, а также для сравнения двух названий треков, той, которая воспроизводится, и той, на которую мы только что нажали, затем, если true, мы указываем, что мы хотим сделать в фигурные скобки.

     
        if SoundManager.shared.player?.isPlaying == true && songs[position] == SoundManager.shared.songs[SoundManager.shared.position] {
            
            //Whatever you want to do
            
        }
...