gpt4 book ai didi

ios - 尽管属性已更改,但应用程序不会立即更新 View

转载 作者:行者123 更新时间:2023-12-01 16:21:10 25 4
gpt4 key购买 nike

我会很感激如何处理此问题的实用建议,因为我完全迷路了。

我有一个Contentview呈现给用户的任务和带有答案选项的三个按钮。选择任何一个选项,用户都将立即获得答案,无论答案是对还是错,并立即显示新任务。而且,还有三个计数器,用于计算每个 session 中已回答任务的常规数量,以及每个 session 中正确和错误答案的数量。

另外,我还有一个切换开关,负责修复以下任务的条件之一。

问题是,一旦我单击此切换开关,它就会接受一个新值,但是只有在用户回答了旧任务后,它才会反射(reflect)在新任务上。简单地说,它仅适用于下一个任务,尽管我希望 View 立即更新为具有此固定条件的新任务,并且在切换之前显示的任务不会被视为答案。

ContentView.swift

    import SwiftUI
import Combine

struct ContentView: View {

@EnvironmentObject var myVM: MyViewModel

var body: some View {

VStack (spacing: 5) {

TitleView()

Spacer()

CountersAndToggleView()

MainTaskView(numberOfPlayersInText: self.myVM.multiplayer, figureOne: self.myVM.figureOne, figureTwo: self.myVM.figureTwo)

AnswerOptionsButtonsRow(option1: self.myVM.answerOpt_1, option2: self.myVM.answerOpt_2, option3: self.my.answerOpt_3, correctAnswer: self.my.correctAnswer)

}
}

CountersAndToggleView.swift
    import SwiftUI
import Combine

struct CountersAndToggleView: View {

@EnvironmentObject var myVM: MyViewModel


var body: some View {
HStack {
VStack {

CounterView(counter: myVM.masterCounter, progressIndicatorColor: .gray, backGroundColor: .white)
HStack {
CounterView(counter: myVM.correctCounter, progressIndicatorColor: .green, backGroundColor: .white)
CounterView(counter: myVM.wrongCounter, progressIndicatorColor: .red, backGroundColor: .white)
}
}

Spacer()

VStack {
Text("Fix multiplayer")
.font(.system(size: 15, design: .rounded))

VStack {

Toggle("Multiplyer", isOn: $myVM.multiplayerFixed)
.labelsHidden()
}
}
}
.padding(.horizontal, 45)
}

myViewModel.swift
    import SwiftUI
import Combine

final class MyViewModel: ObservableObject {

@Published var multiplayer: Int = 1

@Published var figureOne: String = ""
@Published var figureTwo: String = ""

@Published var masterCounter = 0
@Published var correctCounter = 0
@Published var wrongCounter = 0

@Published var multiplayerFixed: Bool = False

init() {
self.generateFigures()
self.randomMultiplayer()
}

.... other functions
}

我希望一旦CountersAndToggleView中的multiplayerFixed更改,ContentView中的mainTaskView将被完全更新,并假设生成了新的数字并确定了Multiplayer的值(value)。

如我所写,实际上只有在用户回答了先前的任务和按钮之后,它才会发生。

你能告诉我我做错了吗?以及应该改变什么?

先感谢您。

最佳答案

在玩了代码之后,我意识到了解决方案的外观。实际上,需要在myViewModel.swift中完成两件事:

  • 属性didChange应该声明为
  •     var didChange = PassthroughSubject<Void, Never>()
  • 应使用didSet
  • 更改 @Published var multiplayerFixed: Bool = False属性
        var multiplayerFixed: Bool = false {didSet {reloadView()}}
  • reloadView函数是一个简单的函数,其中包含更改multiplayerFixed后需要执行的所有代码。就我而言:
  •     func reloadView() {
    self.generateFigures()
    self.randomMultiplayer()
    }

    就这么简单。

    关于ios - 尽管属性已更改,但应用程序不会立即更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59752064/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com