我正在尝试在我的应用程序中显示音量指示器,但首先我需要监视系统的当前音量。
我正在使用观察器,并且当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))
}
}
//固定(将类别设置为环境)(上面的代码更新)另外,每次启动该应用程序时,它都会停止当前播放的所有音乐。
已解决。创建了一个符合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()
}
}