Изменить состояние паузы воспроизведения ячейки кнопки в UITableView с помощью аудиоплеера в Swift - PullRequest
0 голосов
/ 01 февраля 2020

Я добавил аудиоплеер в UITableView, используя https://github.com/jorgenhenrichsen/SwiftAudio этой библиотеки. Плеер работает нормально, но у меня возникла проблема с изменением изображения кнопки паузы воспроизведения в UITableView.

В этой библиотеке есть метод, который дает состояние звука (воспроизведение, готовность, буфер, сбой):

 func setPlayButtonState(forAudioPlayerState state: AudioPlayerState) ()

Этот метод работает нормально и изменяет изображение кнопки при воспроизведении звука при добавлении в View Controller. Но я должен управлять состоянием в UITableViewCell.

Примерно так: enter image description here

Для изменения изображения кнопки ячейки я использовал этот метод:

   func setPlayButtonState(forAudioPlayerState state: AudioPlayerState) () {
       let cell = YOUR_TABLEVIEW_REF.cellForRow(at: IndexPath(row: YOUR_ROW_FOR_LANGUAGE_CELL, section: YOUR_SECTION_FOR_LANGUAGE_CELL)) as! AppSettingViewCell
     cell.playButton.image = UIImage(named: "IMAGE NAME") 
}

Работает для одного индекса. Но то, что мне нужно сделать, это изменить его, чтобы снова остановить состояние при нажатии какой-либо другой строки.

и мой метод настройки ячейки:

func configurePlaylistCell (tableView: UITableView, cell: PlaylistCell, controller: AudioController, indexPath: IndexPath){

    cell.playPauseButton.tag = indexPath.row + 100

    cell.playButtonPressed = { [weak self] (sender: UIButton) in
        self?.indexPathForCell = IndexPath(row: sender.tag - 100 , section: 0)
        if !controller.audioSessionController.audioSessionIsActive {
            try? controller.audioSessionController.activateSession()
        }

        print (controller.player.currentIndex)

        if let item = controller.player.currentItem {
            if (indexPath.row == 0) {
            try? controller.player.load(item: item, playWhenReady: true)
            }else {
                try? controller.player.jumpToItem(atIndex: sender.tag - 100, playWhenReady: true)
            }
        }
        else {
            controller.player.togglePlaying()
        }
    }
}

1 Ответ

1 голос
/ 01 февраля 2020

Вы можете просто сохранить в свойстве индекс текущей игровой ячейки (назовем это X). Затем, нажав эту кнопку в другой ячейке (назовем ее Y), вы можете:

  • Изменить значок в ячейке X
  • Воспроизвести содержимое Y

Это снова приведет к изменению состояния, на этот раз для ячейки Y, поэтому вы измените значок ячейки Y.

В качестве примечания я хочу предупредить вас, что, вероятно, вам следует сохранить состояние все ячейки в какой-либо структуре данных (например, в массиве), а затем использовать ее для удаления из очереди ячеек в cellForRowAtIndexPath , в противном случае вы можете столкнуться с некоторой проблемой, когда ячейки станут больше, чем вы видите на экране , Я не знаю, если вы уже сделали это, но хотел, чтобы вы не попали в другие проблемы позже.

РЕДАКТИРОВАТЬ:

Предполагая, что controller.player.currentIndex (необязательно) ) индекс игровой ячейки) это будет выглядеть примерно так:


    func configurePlaylistCell (tableView: UITableView, cell: PlaylistCell, controller: AudioController, indexPath: IndexPath){

    cell.playPauseButton.tag = indexPath.row + 100

    cell.playButtonPressed = { [weak self] (sender: UIButton) in
        self?.indexPathForCell = IndexPath(row: sender.tag - 100 , section: 0)
        if !controller.audioSessionController.audioSessionIsActive {
            try? controller.audioSessionController.activateSession()
        }

        print (controller.player.currentIndex)

        if let item = controller.player.currentItem {
            if let index = controller.player.currentIndex, let cell = tableView.cellForRow(at: IndexPath(row: index, section: YOUR_SECTION_FOR_LANGUAGE_CELL)) as! AppSettingViewCell {
               cell.playButton.image = UIImage(named: "IMAGE NAME") 
            }
            if (indexPath.row == 0) {
            try? controller.player.load(item: item, playWhenReady: true)
            }else {
                try? controller.player.jumpToItem(atIndex: sender.tag - 100, playWhenReady: true)
            }
        }
        else {
            controller.player.togglePlaying()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...