Ios 如何使用类函数编辑环境对象?
我是swift编程新手。我试图通过一个类函数来改变环境对象的值,从而使用环境对象来更新视图。 contentview中有两个子视图,因为我希望看到当UserData环境对象中的字符串更改时,这两个子视图是否一起更新 但是,有一个错误是“线程1:致命错误:未找到UserData类型的ObservieObject”。UserData的View.environmentObject(:)可能丢失…' 在SceneDelagate.swift中,我注入了环境对象:Ios 如何使用类函数编辑环境对象?,ios,swift,swiftui,observable,environmentobject,Ios,Swift,Swiftui,Observable,Environmentobject,我是swift编程新手。我试图通过一个类函数来改变环境对象的值,从而使用环境对象来更新视图。 contentview中有两个子视图,因为我希望看到当UserData环境对象中的字符串更改时,这两个子视图是否一起更新 但是,有一个错误是“线程1:致命错误:未找到UserData类型的ObservieObject”。UserData的View.environmentObject(:)可能丢失…' 在SceneDelagate.swift中,我注入了环境对象: let userData = UserD
let userData = UserData()
window.rootViewController = UIHostingController(rootView:contentView.environmentObject(userData))
UserData.swift
final class UserData: ObservableObject {
@Published var image: UIImage? = nil
@Published var string = ""
}
斯威夫特
class StringGenerator {
@EnvironmentObject var userData: UserData
func changeURL(){
print("Changing string now from \(userData.string)")
if self.userData.string == "HELLO"{
self.userData.string = "BYE"
}
else{
self.userData.string = "HELLO"
}
print("to \(userData.string)")
}
}
子视图1.swift
struct SubView1: View {
@EnvironmentObject var userData: UserData
var body: some View {
Text("\(userData.string)")
}
}
子视图2.swift
struct SubView2: View {
@EnvironmentObject var userData: UserData
var body: some View {
Text("\(userData.string)")
}
}
ContentView.swift
struct ContentView: View {
@EnvironmentObject var userData: UserData
let stringGenerator = StringGenerator()
var body: some View {
VStack{
Button(action: {
print("Changing Text Now !")
self.stringGenerator.changeURL()
print("\(self.userData.string)")
}) {
Text("Change Text ")
}
SubView1()
SubView2()
}
}
}
通常,我想知道如何通过类函数更改环境对象
代码在我运行时崩溃。这里有什么问题?这里有一个解决方案:
1) 在ContentView中
struct ContentView: View {
@EnvironmentObject var userData: UserData
let stringGenerator: StringGenerator // declare-only
2) 发电机内
class StringGenerator {
var userData: UserData // just member
init(userData: UserData) {
self.userData = userData
}
3) 现场公使
let userData = UserData()
// inject generator via constructor with same user data
let contentView = ContentView(stringGenerator:
StringGenerator(userData: userData))
window.rootViewController = UIHostingController(rootView:
contentView.environmentObject(userData))
stringGenerator
不继承环境,因为它不是视图层次结构的一部分。此外,这里没有类函数。您可以显式地将userData
传递给changeURL
您可以发布一些代码吗?这不会编译,出现错误:“类'StringGenerator'没有初始值设定项”,并且“'StringGenerator'无法构造,因为它没有可访问的初始值设定项”