[英]How to reference with SwiftUI EnvironmentObject
According to the Apple Official guide I'm guessing if each view just has one environmentObject then doing that would be fine.根据 Apple 官方指南,我猜如果每个视图只有一个 environmentObject,那么这样做就可以了。 When there happened to be more than one, I'm not sure how the object are referenced.
当碰巧不止一个时,我不确定如何引用 object。
struct LandmarkList: View {
@EnvironmentObject private var userData: UserData
...
ForEach(userData.landmarks) { landmark in
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationLink(
destination: LandmarkDetail(landmark: landmark)
.environmentObject(self.userData)
) {
LandmarkRow(landmark: landmark)
}
}
}
Above is the code in apple's official guide where in LandMarkDetail file以上是苹果官方指南中的代码,位于 LandMarkDetail 文件中
struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
I am wondering how is the environmentObject in LandMarkList referenced to the environment object in LandmarkDetail.我想知道 LandMarkList 中的 environmentObject 是如何引用 LandmarkDetail 中的环境 object 的。 Are they binded?
他们有约束力吗? I added a second EnvironmentObject in the file but nothing happened
我在文件中添加了第二个 EnvironmentObject 但什么也没发生
struct LandmarkDetail: View {
@EnvironmentObject var userData: UserData
@EnvironmentObject var testData: UserData
So how to reference to each of the userData and testData那么如何引用userData和testData中的每一个
Edit: I tried to add environment object in following file:编辑:我尝试在以下文件中添加环境 object:
import SwiftUI
struct LandmarkList: View {
@EnvironmentObject private var userData: UserData
@EnvironmentObject private var testData: TestData
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Show Favorites Only")
}
Toggle(isOn: $testData.testbool) {
Text("Test")
}
...
struct LandmarksList_Previews: PreviewProvider {
static var previews: some View {
ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
LandmarkList()
.previewDevice(PreviewDevice(rawValue: deviceName))
.previewDisplayName(deviceName)
}
.environmentObject(UserData())
.environmentObject(TestData())
}
}
final class TestData: ObservableObject {
@Published var testbool = false
}
The preview crashed.预览崩溃了。 Xcode could compile but immediately gives following error
Xcode 可以编译但立即给出以下错误
Fatal error: No ObservableObject of type TestData found.
A View.environmentObject(_:) for TestData may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-30.4/Core/EnvironmentObject.swift, line 55
2019-10-12 19:07:46.565707+0800 Landmarks[13034:643289] Fatal error: No ObservableObject of type TestData found.
A View.environmentObject(_:) for TestData may be missing as an ancestor of this view.: file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Monoceros_Sim/Monoceros-30.4/Core/EnvironmentObject.swift, line 55
don't forget to do this in Scenedelegate to bind your object:不要忘记在 Scenedelegate 中执行此操作以绑定您的 object:
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(TestData()).environmentObject(UserData()))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.