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

标签 ios swift swiftui

正如您在 official tutorial project 中看到的那样,在 var 之前放置了这个奇怪的 @EnvironmentObject。什么意思?

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

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

最佳答案

例如,这是出于网络目的。您有一个符合 BindableObject(Beta 5:ObservableObject)的类并通过 PassthroughSubject(Beta 5:@Published) 你的数据。

例如这个案例:

SwiftUI (1.0)

struct Course: Decodable {
    let name: String
}

class NetworkManager: ObservableObject {

    @Published var courses = [Course]()

    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 {
    @ObservedObject var networkManager: NetworkManager = NetworkManager()
    // Or this
    // @EnvironmentObject var networkManager: NetworkManager // Don't forget to instaniate it with .environmentObject()

    var body: some View {
        VStack {
            Button(action: {
                self.networkManager.getAllCourses()
            }, label: {
                Text("Get All Courses")
            })

            List(networkManager.courses, id: \.name) {
                Text($0.name)
            }
        }
    }
}

测试版

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)
            }
        }
    }
}

关于ios - SwiftUI 中的属性 `@EnvironmentObject` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437035/

相关文章:

c# - Xamarin.iOS 中带有填充的 UILabel?

xcode构建错误框架未找到

ios - 如何缩放 UIVIew 以适应 a4 纸张大小

ios - 合并:将闭包转换为发布者

ios - 如何在 swift 5.1 中设置 UICollectionView 的标题大小?

ios - 在 UIBarButtonItem 上添加手势

ios - 为什么 UIDocumentMenu 委托(delegate)给自己不起作用?

URL 中的 SwiftUI 图像未显示

SwiftUI 拖放列表

ios - 在 Swift SpriteKit 中将静态阴影附加到动态 physicsBody 球的底部