ObservableObject типа PageSettings не найден - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу изменить значение моего @EnvironmentObject, используя другое представление для его вызова. Но я получаю эту ошибку. Вот мои синтаксисы

МОЙ КЛАСС

   class PageSettings: ObservableObject {
    @Published var currentPage = "splash"
    @Published var jobTitle = "Pick a job!"
}

ПРОСМОТР (В этом представлении я получаю «Выберите работу!» В виде текста и Я хочу изменить его, когда щелкнул другой параметр в другом представлении, называемом «JobTitleView»)

    struct Test: View {

    @EnvironmentObject var title: PageSettings

    var body: some View {
        HStack{
            Button(action: {
                let alertHC = UIHostingController(rootView: JobTitleView())

                alertHC.preferredContentSize = CGSize(width: 300, height: 200)
                alertHC.modalPresentationStyle = UIModalPresentationStyle.fullScreen

                UIApplication.shared.windows[0].rootViewController?.present(alertHC, animated: true)
            })
            {
                Text(self.title.jobTitle)

                Image(systemName: "chevron.down")
            }
        }.frame(height:50).font(.subheadline)
    }
}

JOBTITLE VIEW

struct JobTitleView: View {

    @EnvironmentObject var title: PageSettings
    let options = ["Manager", "Employee"]

    var body: some View {
        ForEach(options) { item in
            Button(action:{

                self.title.jobTitle = item
                UIApplication.shared.windows[0].rootViewController?.dismiss(animated: true, completion: {})
            }){
                Text(item).font(.custom("Avenir Next Regular", size: 30))
            }
        }
    }
}

Когда я нажал элемент, я получил следующую ошибку:

Неустранимая ошибка: Обнаружен объект ObservableOb типа типа PageSettings. В качестве предка этого представления может отсутствовать View.environmentObject (_ :) для PageSettings. , линия 55

PS. Я получил расширение для использования ForEach "без идентификатора"

extension String: Identifiable {
    public var id: String {
        return self
    }
}

1 Ответ

0 голосов
/ 22 февраля 2020

В месте, где вы создаете Test, вы должны использовать его как

Test().environmentObject(PageSettings())

и, скорее всего, также в этом пользовательском создании (в среде среды иерархии построителя представления объект автоматически вводится для подпредставления, но в этом случае я полагаю, что это не так)

let alertHC = UIHostingController(rootView: 
         JobTitleView().environmentObject(self.pageSettings))
...