SwiftUI Фатальная ошибка: Обнаруженный объект ObservableObject типа "" не найден, а ошибка @EnvironmentObject: может отсутствовать как предок этого представления - PullRequest
2 голосов
/ 24 января 2020

Подробная информация о цели : Я хочу получить данные из базы данных, перечислить данные в строках в формате вопроса и ответа. В ответе будет текстовое поле для его обновления. Есть кнопка сохранения, которая сохранит ответы, загрузив вопрос и ответы в firebase.

Ожидание против результатов: Ожидается кнопка в моем главном меню при нажатии для перехода к экрану. В результате мое приложение зависает, и в консоли появляется следующая ошибка:

Ошибка

Fatal error: No ObservableObject of type AllQuestionsAndAnswersClass found.
A View.environmentObject(_:) for AllQuestionsAndAnswersClass may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-39.4.4/Core/EnvironmentObject.swift, line 55
2020-01-24 13:21:25.523326-0600 FirebaseStarterApp[5025:894100] Fatal error: No ObservableObject of type AllQuestionsAndAnswersClass found.
A View.environmentObject(_:) for AllQuestionsAndAnswersClass may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros/Monoceros-39.4.4/Core/EnvironmentObject.swift, line 55

Мои мысли Я не совсем уверен, с чего начать, но я думаю, что это связано с необходимостью добавить объект среды в предварительный просмотр и сделать что-то в делегате приложения. Я видел кое-что о Scene Delegate, но у меня есть только App Delegate, я не уверен, есть ли разница

Что я пробовал Я пытался просмотреть следующие ссылки, но они не помогли в моем случае SwiftUI @EnvironmentObject error: может отсутствовать как предок этого представления

Не найден ObservableObject типа

Вот мой код для SwiftUI Screen

@available(iOS 13.0, *)
final class AllJobDataClass: ObservableObject  {
    @Published var allJobDataArray = [JobInfo]()
}

@available(iOS 13.0, *)
final class AllQuestionsAndAnswersClass: ObservableObject  {
    @Published var questionsAndAnswersInfoArray = [QuestionAndAnswer]()
}

@available(iOS 13.0.0, *)
struct SingleQuestionAndAnswerRow: View {

     @State var singleQuestionAndAnswerVar: QuestionAndAnswer

     var body: some View {

       return HStack{
             Text("\(singleQuestionAndAnswerVar.question)")

             TextField("Enter some text", text: $singleQuestionAndAnswerVar.answer)
                 .border(Color.black)
         }
     }
}


@available(iOS 13.0.0, *)
struct NewQuestionsScreenSwiftUIView: View {

    @EnvironmentObject var allJobDataVar: AllJobDataClass
    @EnvironmentObject var allQuestionsAndAnswerVar: AllQuestionsAndAnswersClass

    init()
    {
        fetchDataFromFirebase()
    }

    var body: some View {
        ScreenBackground
        {
            List(self.allQuestionsAndAnswerVar.questionsAndAnswersInfoArray) { questionAndAnswer in
                    //here is where questionAnswerRow is presented
                SingleQuestionAndAnswerRow(singleQuestionAndAnswerVar: questionAndAnswer)

                }
        }
        .onTapGesture {
            self.endEditingFunction()
        }
    }
}

@available(iOS 13.0.0, *)
struct NewQuestionsScreenSwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        NewQuestionsScreenSwiftUIView()
    }
}

Мой код для Делегат приложения

import UIKit
import Firebase
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Window setup
        FirebaseApp.configure()
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = UINavigationController(rootViewController: ATCClassicLandingScreenViewController(nibName: "ATCClassicLandingScreenViewController", bundle: nil))
        window?.makeKeyAndVisible()

        return true
    }
  }

1 Ответ

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

У вас есть объявления для объектов среды как

struct NewQuestionsScreenSwiftUIView: View {
    @EnvironmentObject var allJobDataVar: AllJobDataClass
    @EnvironmentObject var allQuestionsAndAnswerVar: AllQuestionsAndAnswersClass

, но вы должны внедрить их где-то перед использованием NewQuestionsScreenSwiftUIView, скажем, при создании (или неявно через родительское представление). В предоставленном коде не видно, где вы создаете NewQuestionsScreenSwiftUIView(), но в этом месте это должно быть что-то вроде

NewQuestionsScreenSwiftUIView()
    .environmentObject(AllJobDataClass()) // < or instance if created before
    .environmentObject(AllQuestionsAndAnswersClass()) // < or instance if created before
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...