Как перезагрузить данные tableView VC1 в другой audioClayerDidFinishPlaying () `другого VC2 - PullRequest
1 голос
/ 13 января 2020

Вот проигрыватель Musi c, в котором есть UIView (гистограмма анимации) в каждой верхней части ячейки tableView (для отображения текущей воспроизводимой песни). Пожалуйста, обратитесь к скриншоту ниже.

enter image description here

/ / / / В 3-й строке это гистограмма анимации в верхней части обложки песни, показывающая текущую воспроизводимую песню , И что я хочу сделать, это позволить этой гистограмме анимации перейти к следующей песне, когда песня заканчивается sh.

В настоящее время я использую audioPlayerDidFinishPlaying(), чтобы вызвать изменения информации о воспроизведении, когда песня фини sh играет. А внутри tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) для установки состояния анимационного изображения в ячейке.

/ / / Мой код, как показано ниже:

  • VC2 (воспроизводимая сцена)
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {

        // Code to change the playing info & track
        if SongData.repeatSequence == "repeatOne" {
            AudioManager.sharedInstance.playTrack(idx: SongData.currentTrack, songList: SongData.songList)

            songTitle.text = SongData.songList[SongData.currentTrack].songName
            songAlbum.text = SongData.songList[SongData.currentTrack].artistName + " - " + SongData.songList[SongData.currentTrack].albumName
            songArtwork.image = SongData.songList[SongData.currentTrack].albumArtwork

        } else if SongData.repeatSequence == "repeatList" {
            // print("play current song done!")

            SongData.currentTrack = (SongData.currentTrack + 1) % (SongData.songList.count)
            AudioManager.sharedInstance.playTrack(idx: SongData.currentTrack, songList: SongData.songList)

            songTitle.text = SongData.songList[SongData.currentTrack].songName
            songAlbum.text = SongData.songList[SongData.currentTrack].artistName + " - " + SongData.songList[SongData.currentTrack].albumName
            songArtwork.image = SongData.songList[SongData.currentTrack].albumArtwork
        } else if SongData.repeatSequence == "shuffle" {
            SongData.currentTrack = Int.random(in: 0 ..< SongData.shuffleSongList.count)
            // SongData.currentTrack = (SongData.currentTrack + 1) % (SongData.songList.count)

            // print("SongData.songList.count", SongData.songList.count)
            AudioManager.sharedInstance.playTrack(idx: SongData.currentTrack, songList: SongData.shuffleSongList)

            songTitle.text = SongData.shuffleSongList[SongData.currentTrack].songName
            songAlbum.text = SongData.shuffleSongList[SongData.currentTrack].artistName + " - " + SongData.shuffleSongList[SongData.currentTrack].albumName
            songArtwork.image = SongData.shuffleSongList[SongData.currentTrack].albumArtwork
            // get index (songList) where the same song in songList from song on shuffleSongList
            NowPlayingViewController.indexFromShuffleList = SongData.songList.firstIndex(where: {$0.songName == songTitle.text}) ?? 0
            // print("=========Shuffle Track=========", NowPlayingViewController.indexFromShuffleList)

            if NowPlayingViewController.indexFromShuffleList >= 0 {
                SongData.currentTrack = NowPlayingViewController.indexFromShuffleList
                NowPlayingViewController.indexFromShuffleList = -1
            }
        }

        // check if song playing is finished
        AudioManager.sharedInstance.audioPlayer.delegate = self
        // SongsTableViewController().tableView.reloadData()
        print("Audio did finish playing")

        updateLockedScreenPlayingInfo()
    }
  • VC1 (SongsTableViewController) та же сцена, что и на скриншоте выше, я настраиваю анимационное изображение следующим образом cell.config(forState: SongData.isPlaying ? .playing : .paused)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell

        if resultSearchController.isActive {
            cell.addButton.tag = indexPath.row
            cell.songTitle.text = filteredTableData[indexPath.row].songName
            cell.songArtist.text = filteredTableData[indexPath.row].artistName
            cell.songArtwork.image = filteredTableData[indexPath.row].albumArtwork

            // set dynamic view on albumArtwork
            if SongData.songList.count == 0 {
                cell.config(forState: .nonState)
            } else {
                if filteredTableData[indexPath.row].songName == SongData.songList[SongData.currentTrack].songName {
                    cell.config(forState: SongData.isPlaying ? .playing : .paused)
                } else {
                    cell.config(forState: .nonState)
                }
            }
        } else {
            cell.addButton.tag = indexPath.row
            cell.songTitle.text = tableData[indexPath.row].songName
            cell.songArtist.text = tableData[indexPath.row].artistName
            cell.songArtwork.image = tableData[indexPath.row].albumArtwork
            // return cell

            // set dynamic view on albumArtwork
            if SongData.songList.count == 0 {
                cell.config(forState: .nonState)
            } else {
                if tableData[indexPath.row].songName == SongData.songList[SongData.currentTrack].songName {
                    print("tableData, songName", tableData[indexPath.row].songName)
                    cell.config(forState: SongData.isPlaying ? .playing : .paused)
                } else {
                    // print("no name matches")
                    cell.config(forState: .nonState)
                }
            }
        }
        return cell
    }

/ / / * Проблема заключается в том, что после воспроизведения текущей песни анимационное изображение не перемещается к следующему , но если изменить его на другой V C и обратно, анимационное изображение было изменено на правильное. Согласно моему исследованию, это потому, что нам нужно перезагрузить данные tableView VC2 в audioPlayerDidFinishPlaying, а затем поставить SongsTableViewController().tableView.reloadData() в конце audioPlayerDidFinishPlaying. Но это не работает, нужна помощь здесь о том, как перезагрузить данные VC2 из VC1 или есть ли другое решение для этого?

1 Ответ

0 голосов
/ 14 января 2020

Ну, я нашел решение в этой теме Как перезагрузить просмотр таблицы из другого контроллера представления в swift

Это чисто и легко в использовании:

В вашем TableView Controller:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "load"), object: nil)
}

func loadList(notification: NSNotification){
    //load data here
    self.tableView.reloadData()
}

Затем в другом ViewController:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
...