У меня проблема с изменением изображения, когда аудио закончено. Как я могу изменить изображение клетки? Пожалуйста, помогите мне. Я напечатал «Done» с помощью «audioPlayerDidFinishPlaying», но я не знаю, как управлять изображением ячейки и т. Д.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if messageList[indexPath.row].fileAudioUid != nil {
        let url = "..."
        startDownload(audioUrl: url)
    }
}


var audioPlayer : AVAudioPlayer!
func startDownload(audioUrl:String) -> Void {
    let fileUrl = self.getSaveFileUrl(fileName: audioUrl)
    let destination: DownloadRequest.DownloadFileDestination = { _, _ in
        return (fileUrl, [.removePreviousFile, .createIntermediateDirectories])
    }

    Alamofire.download(audioUrl, to:destination)
        .downloadProgress { (progress) in
            print(progress)
        }
        .responseData { (data) in
            let url1 = data.destinationURL?.absoluteURL
            print(url1!)
            do {
                self.audioPlayer = try AVAudioPlayer(contentsOf: url1!)
                self.audioPlayer.delegate = self
                self.audioPlayer.prepareToPlay()
                self.audioPlayer.play()
            }catch let error {
                print(error)
            }
    }
}

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    if flag {
        print("Done")
    } else {
        // did not finish successfully
    }
}
0
Ali Ihsan URAL 27 Фев 2018 в 11:22

4 ответа

Лучший ответ

Сохранить ссылку на ячейку

let cellRef: IndexPath?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if messageList[indexPath.row].fileAudioUid != nil {
        let url = "..."
        startDownload(audioUrl: url)
        cellRef = indexPath

    }
}

Затем

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    if flag {
        print("Done")
       let cell = tableView.cellForRow(at:cellRef)
       cell.image = "myImage.png"
    } else {
        // did not finish successfully
    }
}
1
stevenpcurtis 27 Фев 2018 в 08:29

Простой способ обновить изображение UItableViewCell.

Следите за IndexPath.

var cellRef: IndexPath?
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
            if flag {
                print("Done")
                guard let cell = tableView.cellForRow(at: cellRef) as? YourTableViewCell else {
                    return
                }
                cell.imageView?.image = UIImage(named: "YourImageName")
                self.tableView.beginUpdates()
                self.tableView.endUpdates()
            } else {
                // did not finish successfully
            }
        }
1
iParesh 27 Фев 2018 в 09:22

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

if messageList[indexPath.row].fileAudioUid != nil {
    let url = "..."
    startDownload(audioUrl: url)
    cellRef = indexPath

}

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

Пример примера реализации протокола доступен по адресу:

https://stackoverflow.com/a/48882197/9130596

Это для ячейки collectionview, но это то же самое, вы можете сделать это и для ячейки tableview,

Теперь вы можете воспроизводить звук в ячейке ... и также поддерживать ссылку на ячейку, звук которой воспроизводится в ответе @stevenpcurtis, и после успешного завершения воспроизведения звука получите ячейку для этого indexpath и соответственно обновите изображение imageview.

0
Ashwin Shrestha 27 Фев 2018 в 08:37

Вместо использования ячейки в делегате AVAudioPlayer, используйте состояние bool, чтобы знать, аудио закончено или нет. Или используйте свойство isPlaying AVAudioPlayer, чтобы узнать, воспроизводится он или нет, и вы можете соответствующим образом изменить изображение в методе «CellForRow».

0
Rahul Sharma 27 Фев 2018 в 09:02