微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决AppInformation 的 View.environmentObject(_:) 可能缺少作为此视图的祖先

所以我目前正在掌握 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,25)
                        Spacer()
                        
                        Slider(value: appInfo.interval,20)
                        Text("\(Int(appInfo.interval))")
                            .padding(.trailing,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 可能缺少作为此视图的祖先。”

它会在这些行上抛出错误,我将变量作为滑块值引用,即使我在文本视图中进一步引用了变量,这似乎没有任何问题。

                            .padding(.trailing,design: .rounded))

Slider(value: appInfo.interval,20)

解决方法

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

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

回答您的问题:

如果您在代码中的任何地方使用 Settings,则必须将 AppInformation 的 environmentObject 传递给它(请参阅 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,25)
                        Spacer()

                        Slider(value: $appInfo.interval,20)
                        Text("\(Int(appInfo.interval))")
                            .padding(.trailing,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,20)
  • 您应该在视图的外部子级上设置 .navigationTitle("Settings") 修饰符 - 但在 NavigationView
  • 您还可以在 .fontVStack 上设置 HStack 修饰符,这将应用于所有子项(包括滑块标签)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。