如何解决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)
解决方法
首先,您的示例代码不起作用。
- 对您的属性使用
@Published
,然后使用Slider(value: $appInfo.duration,...)
。这是因为Slider
期待绑定(请参阅 https://developer.apple.com/documentation/swiftui/slider) - 在
struct Settings_Previews
之外使用struct Settings
您将在下面找到固定版本。均在预览版和模拟器中运行。
回答您的问题:
如果您在代码中的任何地方使用 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
- 您还可以在
.font
或VStack
上设置HStack
修饰符,这将应用于所有子项(包括滑块标签)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。