【发布时间】:2021-05-08 14:22:41
【问题描述】:
我正在尝试制作一个视图,一旦用户按下按钮,5 个圆圈(灯)将一个接一个地亮起。但是,当模型更改灯光状态时,视图不会更新以表示每个灯光状态。
查看
struct ReactionLightsView: View {
@ObservedObject var viewModel: ReactionLightsViewModel
var body: some View {
VStack {
VStack(spacing: 0) {
HStack {
ForEach(viewModel.lights) { light in
Circle()
.foregroundColor(light.color)
}
}
} .padding()
Button(action: viewModel.start ) {
Text("Start")
}
}
}
}
视图模型
class ReactionLightsViewModel: ObservableObject {
@Published private var model: ReactionLightsModel
init(){
model = ReactionLightsModel()
}
var lights: [Light] {
model.lights
}
func start() {
model.startTest()
}
}
型号
struct ReactionLightsModel {
private(set) var lights: [Light] = [Light(), Light(), Light(), Light(), Light()]
private(set) var start: UInt64?
private(set) var stop: UInt64?
private(set) var reactionTimeNanoseconds: UInt64?
mutating func startTest() {
print("start reaction test")
for i in 0..<5 {
lights[i].turnOn();
sleep(1)
}
for i in 0..<5 {
lights[i].turnOff()
}
start = DispatchTime.now().rawValue
print("done with reaction test")
}
mutating func stopTest() {
stop = DispatchTime.now().rawValue
reactionTimeNanoseconds = (stop! - start!)
print(reactionTimeNanoseconds)
}
}
最初,我将灯光设置为布尔数组,通过此实现,灯光会变为红色(亮起),但只有在 5 秒过去后才会同时变为红色。但是,不是我将每个灯光都更改为自己的对象,并且视图根本不会更新。
灯
struct Light: Identifiable {
private(set) var isLit: Bool = false
private(set) var color: Color = .gray
let id = UUID()
mutating func turnOn() {
isLit = true
color = .red
}
mutating func turnOff() {
isLit = false
color = .gray
}
}
非常感谢有关如何解决此问题的任何建议以及有关如何改进代码的任何其他建议。
【问题讨论】:
-
这一行似乎有点可疑: Button(action: viewModel.start) { 你的意思是 Button(action: viewModel.startTest) { ?
-
也许甚至 viewModel.model.start 因为 viewModel 没有开始元素?
-
很抱歉。复制代码时,我不小心从 viewModel 中留下了我们的 start 方法。重新编辑它。@Baglan
-
@Jelumar 那是我的错。该方法存在,但我在发帖时忘记复制它。将其重新添加。
-
拥有一个既是已发布又是私有的属性,像这样 ->
@Published private var model: ReactionLightsModel是不是很荒谬?不应该是@Published var model: ReactionLightsModel,还是我弄错了?