Кнопка Play / Stop с помощью SwiftUI - PullRequest
0 голосов
/ 16 октября 2019

Я работаю над приложением, которое воспроизводит аудиофайлы, отображаемые в списке.

Аудио файл 1
Аудио файл 2
...
Аудио файл 10

У меня есть аудио, работающее со следующим кодом.

var audioPlayer: AVAudioPlayer?


func playSound1() {

    let path = Bundle.main.path(forResource: "audiofile1.mp3", ofType:nil)!
    let url = URL(fileURLWithPath: path)

    do {
        audioPlayer = try AVAudioPlayer(contentsOf: url)
        audioPlayer?.play()
    } catch {
        print("Could not find file")

    }
}


struct ContentView: View {
    var body: some View {
        Button(action:{ playSound1()}) {
            Text("Audio File 1") }
    }
}

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

1 Ответ

0 голосов
/ 16 октября 2019

Я бы предложил что-то вроде следующего:



class AudioModel: ObservableObject {
    var audioPlayer: AVAudioPlayer?

    @Published current: String = ""

    var audioFiles = ["audiofile1.mp3, audiofile2.mp3, audiofile3.mp3"]

    func playSound() {

        let path = Bundle.main.path(forResource: self.current, ofType:nil)!
        let url = URL(fileURLWithPath: path)

        do {
            audioPlayer = try AVAudioPlayer(contentsOf: url)
            audioPlayer?.play()
        } catch {
            print("Could not find file")

        }
    }

    func stopSound() {
        // Stop AVAudioPlayer
        // audioPlayer.stop() ???
    }
}




struct ContentView: View {

    @ObservedObject audioModel = AudioModel()

    var body: some View {
        VStack {
            ForEach(self.audioModel, id: .\self) { item in
                Button(action:{ 
                        self.audioModel.current = item
                    }) {
                        Text(item) 
                    }
                }
            }
        }.onReceive(self.audioModel.$current) {
            self.audioModel.stopSound()
            self.audioModel.playSound()
        }
    }

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

@Published аналогичнона @State и дополнительно создает Publisher , поэтому при каждом обновлении будет выполняться вызов onReceive(). Это достигается путем "наблюдения" объекта с помощью декоратора @ObservedObject, который может применяться только к классу, соответствующему ObservableObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...