AppInformation 的 View.environmentObject(_:) 作为此视图的祖先可能缺失

A View.environmentObject(_:) for AppInformation may be missing as an ancestor of this view

所以我目前正在处理 swift 和 swiftui 并且 运行 遇到了 Observable 对象的问题。我希望能够在 2 个不同的视图上共享变量的值,因此选择使用 Observable 对象。将使用设置视图上的滑块设置持续时间和间隔变量,然后将其用于我的主视图中的逻辑。


struct Settings: View {
    @EnvironmentObject var appInfo: AppInformation
    
    
    
    var body: some View {
        NavigationView {
            ZStack {
                VStack (spacing: 35){
                    HStack {
                        Text("Duration")
                            .font(.system(size: 23, weight: .bold, design: .rounded))
                            .padding(.leading, 25)
                        Spacer()
                        
                        Slider(value: appInfo.duration, in: 1...60, step: 1)
                            .padding(.trailing, 20)
                            .padding(.leading, 20)
                        Text("\(Int(appInfo.duration))")
                            .padding(.trailing, 30)
                            .font(.system(size: 23, weight: .medium, design: .rounded))
                    }
                    
                    .padding(.top, 100)
                    
                    
                    HStack {
                        Text("Interval  ")
                            .font(.system(size: 23, weight: .bold, design: .rounded))
                            .padding(.leading, 25)
                        Spacer()
                        
                        Slider(value: appInfo.interval, in: 1...60, step: 1)
                            .padding(.trailing, 20)
                            .padding(.leading, 20)
                        Text("\(Int(appInfo.interval))")
                            .padding(.trailing, 30)
                            .font(.system(size: 23, weight: .medium, design: .rounded)).navigationTitle("Settings")
                    }
                    Spacer()
                }
                
                
            }
            
        }
        
        
        
}
    

struct Settings_Previews: PreviewProvider {
    static var previews: some View {
        Settings()
            .environmentObject(AppInformation())
    }
}
    
}

class AppInformation: ObservableObject {
    var duration = 0.0
    var interval = 0.0
}

但是当尝试在模拟器中预览或晒出我的应用程序时,它会抛出错误 'A View.environmentObject(_:) for AppInformation may be missing as an ancestor of this view.'

它在我将变量作为滑块值引用的这些行上抛出错误,即使我已经在更下方的文本视图中引用了变量,这似乎没有任何问题。

                            .padding(.trailing, 20)
                            .padding(.leading, 20)
                        Text("\(Int(appInfo.duration))")
                            .padding(.trailing, 30)
                            .font(.system(size: 23, weight: .medium, design: .rounded))

Slider(value: appInfo.interval, in: 1...60, step: 1)
                            .padding(.trailing, 20)
                            .padding(.leading, 20)

首先,您的示例代码无法正常工作。

下面是固定版本。 运行 在预览和模拟器中。

回答你的问题:

如果您在代码中的任何地方使用 Settings,则必须向其传递一个 AppInformation 的环境对象(参见 ContentView)。由于您没有在上下文中提供任何源代码,我认为这就是您的错误所在。

这是一个工作示例:

import SwiftUI
import CoreData

class AppInformation: ObservableObject {
    @Published var duration = 0.0
    @Published var interval = 0.0
}

struct Settings: View {
    @EnvironmentObject var appInfo: AppInformation

    var body: some View {
        NavigationView {
            ZStack {
                VStack (spacing: 35){
                    HStack {
                        Text("Duration")
                            .font(.system(size: 23, weight: .bold, design: .rounded))
                            .padding(.leading, 25)
                        Spacer()

                        Slider(value: $appInfo.duration, in: 1...60, step: 1)
                            .padding([.trailing, .leading], 20)
                        Text("\(Int(appInfo.duration))")
                            .padding(.trailing, 30)
                            .font(.system(size: 23, weight: .medium, design: .rounded))
                    }
                    .padding(.top, 100)

                    HStack {
                        Text("Interval  ")
                            .font(.system(size: 23, weight: .bold, design: .rounded))
                            .padding(.leading, 25)
                        Spacer()

                        Slider(value: $appInfo.interval, in: 1...60, step: 1)
                            .padding([.trailing, .leading], 20)
                        Text("\(Int(appInfo.interval))")
                            .padding(.trailing, 30)
                            .font(.system(size: 23, weight: .medium, design: .rounded))

                    }
                    Spacer()
                }
            }
            .navigationTitle("Settings")
        }
    }
}

struct Settings_Previews: PreviewProvider {
    static var previews: some View {
        Settings()
            .environmentObject(AppInformation())
    }
}

struct ContentView: View {
    @ObservedObject var appInformation = AppInformation()

    var body: some View {
        Settings()
            .environmentObject(appInformation)
    }

}

这里还有一些使用 SwiftUI 的技巧:

  • 如果您需要在多条边上设置填充,您也可以使用 .padding([.trailing, .leading], 20)
  • 您应该在视图的外部子视图上设置 .navigationTitle("Settings") 修饰符 - 但在 NavigationView
  • 您还可以在 VStackHStack 上设置 .font 修饰符,这会将其应用于所有子项(包括滑块标签)