Приложение не обновляет вид сразу, хотя свойство было изменено - PullRequest
2 голосов
/ 15 января 2020

Буду признателен за практический совет, как решить эту проблему, потому что я полностью потерян.

У меня есть Contentview, представляющий задачу для пользователя, и три кнопки с вариантами ответа. Выбрав любой из вариантов, пользователь получает немедленный ответ, будь то правильный или неправильный ответ, и сразу же ставится новая задача. Кроме того, есть три счетчика, которые подсчитывают общее количество отвеченных задач за сеанс и соответственно количество правильных и неправильных ответов за сеанс.

Также у меня есть переключатель, который отвечает за исправление одного из условий для следующего Задачи.

Проблема в том, что, когда я нажимаю этот переключатель, он принимает новое значение, но он отражается в новой задаче только после того, как пользователь ответит на старую задачу. Проще говоря, это работает только со следующей задачей, хотя я хотел бы, чтобы представление обновлялось до новой задачи с этим фиксированным условием, и задача, представленная перед переключением, не считалась бы ответом.

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
        }

I хотелось бы, чтобы после исправления multiplayerFixed в CountersAndToggleView mainTaskView в ContentView полностью обновлялся, предполагая, что поколения новых фигур и значение многопользовательского режима будут фиксированными.

Как я уже писал, в действительности это происходит только после того, как пользователь ответит на предыдущий Задание и кнопка pu sh.

Не могли бы вы сообщить, что я делаю неправильно? и что надо менять?

Заранее спасибо.

1 Ответ

0 голосов
/ 18 января 2020

После игры с кодом я понял, как должно выглядеть решение. На самом деле нужно сделать две вещи в myViewModel.swift:

  1. Свойство didChange должно быть объявлено
    var didChange = PassthroughSubject<Void, Never>()
Свойство @Published var multiplayerFixed: Bool = False должно быть изменено с помощью didSet
    var multiplayerFixed: Bool = false {didSet {reloadView()}}
reloadView функция - это простая функция, включающая любой код, который необходимо выполнить после изменения multiplayerFixed. В моем случае:
    func reloadView() {
           self.generateFigures()
           self.randomMultiplayer()
    } 

Все так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...