SwiftUI中的@EnvironmentObject属性是什么意思?

时间:2019-06-04 03:38:50

标签: swift swiftui

您可以在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 })!
    }
    // ...
}

4 个答案:

答案 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

我从苹果文档中找到了。

  

苹果的描述:

     

动态视图属性,该属性使用由   祖先视图使可绑定的当前视图无效   对象更改。

apple doc

我的理解是,无论何时我们将值或对象设置为init。例如:清单。 当我们重新加载列表时,一些显示的视图对象将被替换和删除。

答案 2 :(得分:0)

这是一个BindableObject,SwiftUI将使用它来确定如何通过访问对象刷新视图。在示例中签出UserData类。声明环境对象的视图的任何子级都可以访问它。在这种情况下,userData

答案 3 :(得分:0)

它旨在让您的视图自动访问模型,而无需依赖注入。

在场景委托中设置一次环境对象,然后层次结构中的所有视图都可以通过其自己的magic属性对其进行访问。我相信视图也可以为其子对象覆盖该对象,但我尚未对其进行测试。