Как внедрить.environmentObject() в watchOS6

Я хочу внедрить EnvironmentObject при создании представления SwiftUI в watchOS6.

Но так как WKHostingController ожидает конкретный тип, я не могу сделать следующее ContentView().environmentObject(UserData())

class HostingController: WKHostingController<ContentView> {
    override var body: ContentView {
        return ContentView().environmentObject(UserData())
    }
}

Этот код завершается со следующей ошибкой:

Невозможно преобразовать возвращаемое выражение типа 'some View' в тип возвращаемого значения 'ContentView'

Я видел обходной путь, подобный следующему: использование environmentObject в watchOS это похоже на взлом, а не на правильное решение.

Я спросил инженера watchOS в Twitter о том же, и его ответ должен был быть размещен .environmentObject(UserData()) внутри тела ContentView(), Я пытался сделать это, но Xcode сообщает об ошибке.

Так кто-нибудь нашел способ сделать то же самое?

1 ответ

Решение

Обходной путь по ссылке использует AnyViewЭто очень плохая идея. В нескольких других вопросах и твитах инженеров Apple объяснялось, что AnyView следует использовать только для конечных представлений, так как в противном случае производительность сильно падает.

Что касается второго варианта (поставьте environmentObject внутри ContentView), работает нормально. Вот вам пример:

class UserData: ObservableObject {
    @Published var show: Bool = true
}

struct ContentView: View {
    @State var model = UserData()

    var body: some View {
        SubView().environmentObject(model)
    }
}

struct SubView: View {
    @EnvironmentObject var model: UserData

    var body: some View {
        VStack {
            Text("Tap Me!").onTapGesture {
                self.model.show.toggle()
            }

            if self.model.show {
                Text("Hello World")
            }
        }
    }
}
Другие вопросы по тегам