Как обращаться с SwiftUI EnvironmentObject - PullRequest
2 голосов
/ 12 октября 2019

В соответствии с официальным руководством Apple, я предполагаю, что если в каждом представлении есть только один объект среды, то это будет хорошо. Когда оказалось, что их несколько, я не уверен, как на объект ссылаются.

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

Выше приведен код в официальном руководстве Apple, где в файле LandMarkDetail

struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData

Мне интересно, как environmentObject в LandMarkList ссылается на объект среды в LandmarkDetail. Они связаны? Я добавил второй EnvironmentObject в файл, но ничего не произошло

struct LandmarkDetail: View {
    @EnvironmentObject var userData: UserData
    @EnvironmentObject var testData: UserData

Итак, как ссылаться на каждый из userData и testData

Редактировать: Я пытался добавить объект окружения в следующий файл:

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
}

Предварительный просмотр потерпел крах. 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

1 Ответ

1 голос
/ 22 октября 2019

не забудьте сделать это в Scenedelegate, чтобы связать ваш объект:

window.rootViewController = UIHostingController(rootView: contentView.environmentObject(TestData()).environmentObject(UserData()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...