在Swift程序中,我有几个嵌套的视图。在最底层的视图中,我有一个滑块。我想把它的值从这个视图传递到Swift主文件,在那里全局变量存储在一个结构中。这个值将用于控制使用AudioKit播放的音频的音量。
滑块的代码(此处未包括完整视图,因为其余部分无关紧要):
struct MasterFaderView: View {
var body: some View {
Slider(
value: master.Value,
in: 0...127,
step: 1.0)
}
}
正在设置的顶级全局变量:
struct channel {
var Value: Double = 0.0 // Default fader value
... // Other variables being stored
}
var master = channel()
@main
struct MEngProjectApp: App {
var body: some Scene {
WindowGroup {
FreePlayView()
}
}
}
FreePlayView()是包含audioKit内容的主视图,将控制音量:
class MixerClass: ObservableObject {
let engine = AudioEngine()
var fullTrack = AudioPlayer()
init() {
engine.output = fullTrack
loadFiles()
try? engine.start()
}
func loadFiles() {
do {
if let fileURL = Bundle.main.url(forResource: "DQ_FullTrack", withExtension: "wav") {
try fullTrack.load(url: fileURL)
} else {
Log("Could not find file")
}
} catch {
Log("Could not load full track")
}
}
}
struct FreePlayView: View {
@StateObject var conductor = MixerClass()
@State var trackPlaying: Bool = false
var body: some View {
Button(action: {
if trackPlaying == false {
conductor.fullTrack.start()
conductor.fullTrack.volume = master.Value
trackPlaying = true
} else {
conductor.fullTrack.stop()
trackPlaying = false
}
}) {
Text("Start Audio")
}
我在MasterFaderView中得到的错误代码是Cannot convert value of type 'Double' to expected argument type 'Binding<Double>'
有人知道怎么解决吗?
先谢了。
1条答案
按热度按时间3zwjbxry1#
要在App中的不同位置使用变量,可以使用
ObservableObject
类,类中有@Published var value: Double = 0.0
,如class ChannelModel: ObservableObject
所示,只要value
发生变化,界面就会刷新。在您的应用中声明此
ChannelModel
,并使用.environmentObject(channelModel)
和@EnvironmentObject var channel: ChannelModel
传递它,如FreePlayView
和MasterFaderView
所示。下面是此方法的一些示例代码: