【问题标题】:A View.environmentObject(_:) for AppInformation may be missing as an ancestor of this viewAppInformation 的 View.environmentObject(_:) 作为此视图的祖先可能会丢失
【发布时间】:2021-07-08 06:49:06
【问题描述】:

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


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 original 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)

【问题讨论】:

    标签: swift swiftui observableobject


    【解决方案1】:

    首先,您的示例代码不起作用。

    您将在下面找到固定版本。在预览版和模拟器中运行。

    回答您的问题:

    如果您在代码中的任何位置使用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 修饰符,这会将其应用于所有子项(包括滑块标签)

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2021-12-30
      相关资源
      最近更新 更多