Доступ к свойству объекта среды внутри вычисляемого свойства структуры - PullRequest
0 голосов
/ 18 апреля 2020

В настоящее время у меня есть структура, которая имеет вычисляемое свойство с именем "answerArray". Я хочу сравнить этот массив значений с другим массивом значений, который хранится в объекте Environment.

struct CandidateModel {
@EnvironmentObject var model: CardViewModel

let index: Int
var name: String
var answers: [AnswerModel]
var answerArray: [Double] {
    get {
        var arr: [Double] = []
        for i in answers {
            if i.isKeyIssue {
            // If answer is a key issue
                arr.append(i.score * 1.5)
                // Apply multiplier and append to answer array
            }
            else {arr.append(i.score)}
            // otherwise just append to list
        }
        return arr
    }
}
var scoreArray: [Double] {
    get {

        var compScoreArray: [Double] = []

        for i in 0...self.model.getAnswerList().count - 1 {
            let questionDifference = abs(self.answerArray[i] - self.model.answerList[i])
            compScoreArray.append(questionDifference)
        }

        return compScoreArray
    }
}

При попытке получить доступ к этому свойству я получаю следующую ошибку:

Thread 1: Fatal error: No ObservableObject of type CardViewModel found. A View.environmentObject(_:) for CardViewModel may be missing as an ancestor of this view.

Я просто пытаюсь обновить свойство ScoreArray в CandidateModel как свойство answerList в моей среде объект меняется. Как я мог бы лучше реализовать это?

Вот мой код просмотра:

struct SentimentComparisonBarView: View {
@EnvironmentObject var model: CardViewModel

var body: some View {
    HStack {
      // 2
        Image("Jobs_Economy")
            .renderingMode(.template)
            .resizable()
            .scaledToFit()
            .frame(width: 50)
            .foregroundColor(Color.init(#colorLiteral(red: 0.3942148186, green: 0.3146163453, blue: 0.4587302703, alpha: 1)))

        Text("Jobs/Economy")
            .frame(width: 120, alignment: .leading)
          // 3
          Rectangle()
            .fill(Color.init(#colorLiteral(red: 0.5201314092, green: 0.3027745485, blue: 0.49252671, alpha: 1)))
            .frame(width: CGFloat(2 * 10.0), height: 5.0)
          // 4
          Spacer()
            Text("Low")
                .padding(.horizontal, 10)

        Button("Test") {
            print(self.model.presidentialCandidates[0].scoreArray)
        }

    }
}

1 Ответ

1 голос
/ 18 апреля 2020

Вы должны использовать @EnvironmentObject в своем представлении и передать его своей модели. И не забудьте позвонить .environmentObject, чтобы ввести CardViewModel в SceneDelegate. Например:

let myView = MyView().environmentObject(CardViewModel())
...