SwiftUI EnvironmentObject недоступен в инициализаторе представления? - PullRequest
1 голос
/ 03 марта 2020

Я успешно передал окружение appSettings на мой взгляд. Я могу использовать его, чтобы изменить мой шрифт и средство выбора в моем представлении. Но если я пытаюсь получить доступ к опубликованной переменной environmentObject в представлении init (), она вылетает с:

Thread 1: Fatal error: No ObservableObject of type AppSettings found.
A View.environmentObject(_:) for AppSettings may be missing as an ancestor of this view.

Существуют ли специальные правила использования environmentObject в пользовательском инициализаторе SwiftUI View?

Вот начало моего кода просмотра. EnvironmentObject - это appSettings. Если я закомментирую строку 2 в моем инициализаторе и раскомментируем строку 3, приложение будет работать. Обратите внимание, что позже я успешно использую appSettings.interfaces в моем средстве выбора.

struct CaptureFilterView: View {

@State var etherCapture: EtherCapture? = nil
@EnvironmentObject var appSettings: AppSettings
@Binding var frames: [Frame]
@State var captureFilter: String = ""
@State var error: String = ""
@State var numberPackets = 10

@State var interface: String = ""
init(frames: Binding<[Frame]>) {
    self._frames = frames
    self.interface = appSettings.interfaces.first ?? "en0" //CRASH HERE
    //self.interface = "en0"  //uncomment this and comment line above to make app "work"
}
var body: some View {
    HStack() {
        ...
        Picker(selection: $interface, label: Text("")) {
            ForEach(appSettings.interfaces, id: \.self) { interfaceName in
                Text(interfaceName).tag(interfaceName)
            }
        }

Здесь я создаю свое представление контента верхнего уровня в моем AppDelegate.swift

        let contentView = ContentView(showCapture: true).environmentObject(appSettings)

И просто чтобы быть уверенным Я также передаю environmentObject при создании моего CaptureFilterView в моем ContentView верхнего уровня. Это не является необходимым и не меняет поведение.

            if showCapture { CaptureFilterView(frames: self.$frames).environmentObject(appSettings) }

Для справки вот верхняя часть моего приложенияНастройки:

class AppSettings: ObservableObject {
    @Published var font: Font
    @Published var interfaces: [String]

1 Ответ

2 голосов
/ 03 марта 2020

SwiftUI EnvironmentObject недоступен в инициализаторе View?

Да, SwiftUI EnvironmentObject недоступен в инициализаторе View. Почему? Это просто - оно вводится после инициализации объекта.

Давайте рассмотрим, как это делается на примере выше ContentView:

let contentView = ContentView(showCapture: true).environmentObject(appSettings)

, так что происходит Вот? Здесь

1) создание экземпляра и инициализация значения для типа ContentView

let newInstance = ContentView.init(showCapture: true) 

2) вызов функции func environmentObject() в newInstance введенное appSetting свойство

let contentView = newInstance.environmentObject(appSettings)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...