在SwiftUI中观察系统卷

问题描述 投票:0回答:1

我正在尝试在我的应用程序中显示音量指示器,但首先我需要监视系统的当前音量。

我正在使用观察器,并且当print语句显示正确的值时,UI从不这样做。

import SwiftUI
import MediaPlayer

struct ContentView: View {
    @State var vol: Float = 1.0

    // Audio session object
    private let session = AVAudioSession.sharedInstance()
    // Observer
    private var progressObserver: NSKeyValueObservation!

    init() {
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.ambient)
                try session.setActive(true, options: .notifyOthersOnDeactivation)
                self.vol = 1.0
            } catch {
                print("cannot activate session")
            }

            progressObserver = session.observe(\.outputVolume) { [self] (session, value) in
                print(session.outputVolume)
                self.vol = session.outputVolume
            }
        }

    var body: some View {
        Text(String(self.vol))
    }
}

//固定(将类别设置为环境)(上面的代码更新)另外,每次启动该应用程序时,它都会停止当前播放的所有音乐。

ios swift swiftui avaudiosession
1个回答
0
投票

已解决。创建了一个符合ObservableObject的类,并在视图中使用ObservedObject属性。

VolumeListener.swift

import Foundation
import MediaPlayer

final class VolumeListener: ObservableObject {
    @Published var volume: Float = AVAudioSession.sharedInstance().outputVolume

    // Audio session object
    private let session = AVAudioSession.sharedInstance()
    // Observer
    private var progressObserver: NSKeyValueObservation!


    init() {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.ambient)
            try session.setActive(true, options: .notifyOthersOnDeactivation)
        } catch {
            print("cannot activate session")
        }

        progressObserver = session.observe(\.outputVolume) { [self] (session, value) in
            DispatchQueue.main.async {
                self.volume = session.outputVolume
            }
        }
    }
}

ContentView.swift

import SwiftUI
import MediaPlayer

struct ContentView: View {

    @ObservedObject private var vol = VolumeListener()

    init() {
        print(vol.volume)
    }

    var body: some View {
        Text(String(vol.volume))
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.