Неустранимая ошибка: не найден наблюдаемый объект типа buttonState

#ios #swift #swiftui

#iOS #swift #swiftui

Вопрос:

Я устанавливаю несколько переменных среды в приложении моего приложения SwiftUI, и одна из них не может быть найдена дочерними представлениями, и я не могу понять, почему !?!

 import SwiftUI

@main
struct MentalMathSwiftUIApp: App {
    @ObservedObject var buttonState = ButtonState()
    
    var body: some Scene {
        WindowGroup {
            MainView()
                .environmentObject(buttonState)
        }
    }
}
  

buttonState

 class ButtonState: ObservableObject{
    
    enum ButtonState: String {
        case STOPPED
        case ACTIVE
        case PAUSED
    }
    
    @Published var currentButtonState: ButtonState = .STOPPED
  

Основной вид

 struct MainView: View {
    @EnvironmentObject var buttonState: ButtonState
    
    init(){
        var t = buttonState.currentButtonState  <- **Fatal error: No ObservableObject of type ButtonState found. A View.environmentObject(_:) for ButtonState may be missing as an ancestor of this view.**
    }
    
    var body: some View {
        
        VStack {
            Text("Mental Maths!")
                .font(.largeTitle)
                .fontWeight(.heavy)
            
            ContainerView()
            MainButtonView()
        }
    }
}
  

Делайте все возможное, чтобы игнорировать бессмысленную логику в init() of MainView , но почему я не могу извлечь buttonState из переменной среды на данный момент?

Ответ №1:

Инициализатор выполняется до .environmentObject того, как может быть вызван для ввода @EnvironmentObject . Вот почему попытка получить доступ к указанному объекту среды из init вызывает фатальную ошибку.

Вы должны ввести объект в init вместо того, чтобы устанавливать его как an @EnvironmentObject , чтобы избежать сбоев во время выполнения.

 struct MainView: View {
    @ObservedObject var buttonState: ButtonState
    
    var body: some View {
        
        VStack {
            Text("Mental Maths!")
                .font(.largeTitle)
                .fontWeight(.heavy)
            
            ContainerView()
            MainButtonView()
        }
    }
}

@main
struct MentalMathSwiftUIApp: App {
    @ObservedObject var buttonState = ButtonState()
    
    var body: some Scene {
        WindowGroup {
            MainView(buttonState: buttonState)
        }
    }
}