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)
首先,您的示例代码无法正常工作。
- 对您的属性使用
@Published
,然后使用 Slider(value: $appInfo.duration, ...)
。这是因为 Slider
需要绑定(参见 https://developer.apple.com/documentation/swiftui/slider)
- 在
struct Settings
之外使用 struct Settings_Previews
下面是固定版本。 运行 在预览和模拟器中。
回答你的问题:
如果您在代码中的任何地方使用 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
内
- 您还可以在
VStack
或 HStack
上设置 .font
修饰符,这会将其应用于所有子项(包括滑块标签)
所以我目前正在处理 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)
首先,您的示例代码无法正常工作。
- 对您的属性使用
@Published
,然后使用Slider(value: $appInfo.duration, ...)
。这是因为Slider
需要绑定(参见 https://developer.apple.com/documentation/swiftui/slider) - 在
struct Settings
之外使用
struct Settings_Previews
下面是固定版本。 运行 在预览和模拟器中。
回答你的问题:
如果您在代码中的任何地方使用 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
内
- 您还可以在
VStack
或HStack
上设置.font
修饰符,这会将其应用于所有子项(包括滑块标签)