Что означает атрибут `@ EnvironmentObject` в SwiftUI? - PullRequest
4 голосов
/ 04 июня 2019

Как вы можете видеть в официальном учебном проекте , этот странный @EnvironmentObject стоит перед var. Что это значит?

struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData
    var landmark: Landmark

    var landmarkIndex: Int {
        userData.landmarks.firstIndex(where: { $0.id == landmark.id })!
    }
    // ...
}

Ответы [ 3 ]

3 голосов
/ 08 июня 2019

Это, например, для сетевых целей. У вас есть класс, соответствующий 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)
            }
        }
    }
}
0 голосов
/ 05 июня 2019

Это BindableObject, который SwiftUI будет использовать для определения того, как обновить ваши представления посредством доступа к объекту.Проверьте класс UserData в примере.Любой дочерний элемент представления, который объявляет объект среды, будет иметь к нему доступ.В этом случае userData.

0 голосов
/ 04 июня 2019

EnvironmentObject

Я нашел в документе Apple.

Описание от яблока:

Свойство динамического представления, которое использует привязываемый объект, предоставленный представление предка, чтобы сделать недействительным текущее представление всякий раз, когда связываемый объект меняется.

Apple Doc

Я понимаю, что когда бы мы ни установили значение или объект был init. Пример: список. Когда мы перезагружаем List, некоторые показанные объекты View заменяются и удаляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...