swiftui - 不能在不可变值上使用变异成员:'self' 在 SwiftUI 中是不可变的
问题描述
对于以下代码,我收到以下错误。我不知道如何解决这个问题。如何volumeCheck()
在按钮单击时调用?
struct ContentView: View {
var player = AVAudioPlayer()
var body: some View {
HStack {
Button(action: {
self.volumeCheck()
}) {
Text("Click to test chimes volume")
}
}
}
mutating func volumeCheck() {
guard let url = Bundle.main.url(
forResource: "chimes",
withExtension: "mp3"
) else { return }
do {
player = try AVAudioPlayer(contentsOf: url)
player.prepareToPlay()
player.volume = Float(self.sliderValue)
player.play()
} catch let error {
print(error.localizedDescription)
}
print("volume checked print")
}
}
解决方案
问题是它View
是 astruct
并且它的body
字段是具有非可变 getter 的计算属性。在您的代码中,它会在该非变异 getter 中调用变异方法。所以你需要做的就是把你的播放器放到某种模型上:
class Model {
var player: AVPlayerPlayer()
}
struct ContentView: View {
var model = Model()
// player can be changed from anywhere
}
PS 在某些其他情况下,您可能希望模型中的更改反映在视图中,因此您必须在模型声明之前添加@ObservedObject。
希望有帮助
推荐阅读
- java - 在密文公开的Java中加密消息的最佳方法
- botframework - 如何在机器人框架作曲家中模拟等待消息
- javascript - 如何创建 oauth2 令牌请求?
- java - 如何让我的 hashmap 公开以从 java 中的任何地方打印?
- javascript - 如何在 Vue.js 3 中制作自定义指令?
- ruby-on-rails - 嵌套属性、列计算和 where 语句
- flutter - 如何在颤动中将变量从一个类传递到另一个类
- algorithm - 如何优化两个列表的比较以减少更新次数
- asp.net - ASP.NET 4.8 功能在 IIS 8.5 (Windows Server 2012 R2) 中不可用
- reactjs - 反应 Mathquill 命令以使只读