您可以在official tutorial project中看到,在@EnvironmentObject
之前放置了一个奇怪的var
。什么意思?
struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
var landmark: Landmark
var landmarkIndex: Int {
userData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
// ...
}
答案 0 :(得分:3)
例如,出于网络目的。您有一个符合BindableObject
的类,并通过PassthroughSubject
发送您的数据。
例如这种情况:
struct Course: Decodable {
let name: String
}
class NetworkManager: BindableObject {
let didChange = PassthroughSubject<NetworkManager, Never>()
var courses = [Course]() {
didSet {
didChange.send(self)
}
}
func getAllCourses() {
guard let url = URL(string: "https://api.letsbuildthatapp.com/jsondecodable/courses") else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
let courses = try JSONDecoder().decode([Course].self, from: data!)
DispatchQueue.main.async {
self.courses = courses
}
} catch {
print("Failed To decode: ", error)
}
}.resume() // VERY IMPORTANT! As the request won't run
}
}
struct ContentView : View {
@EnvironmentObject var networkManager: NetworkManager
var body: some View {
VStack {
Button(action: {
self.networkManager.getAllCourses()
}, label: {
Text("Get All Courses")
})
List(networkManager.courses.identified(by: \.name)) {
Text($0.name)
}
}
}
}
答案 1 :(得分:0)
EnvironmentObject
我从苹果文档中找到了。
苹果的描述:
动态视图属性,该属性使用由 祖先视图使可绑定的当前视图无效 对象更改。
我的理解是,无论何时我们将值或对象设置为init。例如:清单。 当我们重新加载列表时,一些显示的视图对象将被替换和删除。
答案 2 :(得分:0)
这是一个BindableObject,SwiftUI将使用它来确定如何通过访问对象刷新视图。在示例中签出UserData类。声明环境对象的视图的任何子级都可以访问它。在这种情况下,userData
。
答案 3 :(得分:0)
它旨在让您的视图自动访问模型,而无需依赖注入。
在场景委托中设置一次环境对象,然后层次结构中的所有视图都可以通过其自己的magic属性对其进行访问。我相信视图也可以为其子对象覆盖该对象,但我尚未对其进行测试。