Использование environmentObject в watchOS - PullRequest
6 голосов
/ 12 июня 2019

Я пытаюсь использовать environmentObject в приложении watchOS6 для привязки моей модели данных к моему представлению.

Я создал простое автономное приложение Watch в Xcode 11.

Я создал новый DataModel класс

import Combine
import Foundation
import SwiftUI

final class DataModel: BindableObject {

    let didChange = PassthroughSubject<DataModel,Never>()

    var aString: String = "" {
        didSet {
            didChange.send(self)
        }
    }

}

В моей структуре ContentView я связываю этот класс, используя @EnvironmentObject -

struct ContentView : View {

    @EnvironmentObject private var dataModel: DataModel

    var body: some View {
        Text($dataModel.aString.value)
    }
}

Наконец, я пытаюсь внедрить экземплярDataModel в среду в HostingController классе -

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

Но я получаю ошибку:

Cannot convert return expression of type '_ModifiedContent<ContentView, _EnvironmentKeyWritingModifier<DataModel?>>' to return type 'ContentView'

Ошибка в том, что WKHostingController являетсяуниверсальный, который нуждается в конкретном типе - WKHostingController<ContentView> в этом случае.

Подобный подход прекрасно работает с UIHostingController в приложении для iOS, поскольку UIHostingController не является универсальным классом.

Есть ли какой-либо другой способ внедрить среду в представление watchOS?

1 Ответ

9 голосов
/ 12 июня 2019

Вы можете использовать стирание типа, AnyView в случае SwiftUI View.

Я бы реорганизовал WKHostingController, чтобы вернуть AnyView.

Кажется, это хорошо скомпилируетсяна моем конце.

class HostingController : WKHostingController<AnyView> {
    override var body: AnyView {
        return AnyView(ContentView().environmentObject(DataModel()))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...