首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在watchOS中使用environmentObject

在watchOS中使用environmentObject
EN

Stack Overflow用户
提问于 2019-06-12 14:15:00
回答 3查看 2.8K关注 0票数 25

我正尝试在watchOS6应用程序中使用environmentObject将我的数据模型绑定到视图。

我已经用Xcode11创建了一个简单的独立Watch应用程序。

我创建了一个新的DataModel

代码语言:javascript
运行
复制
import Combine
import Foundation
import SwiftUI

final class DataModel: BindableObject {

    let didChange = PassthroughSubject<DataModel,Never>()

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

}

在我的ContentView结构中,我使用@EnvironmentObject绑定这个类-

代码语言:javascript
运行
复制
struct ContentView : View {

    @EnvironmentObject private var dataModel: DataModel

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

最后,我尝试在HostingController类中将DataModel的实例注入到环境中-

代码语言:javascript
运行
复制
class HostingController : WKHostingController<ContentView> {
    override var body: ContentView {
        return ContentView().environmentObject(DataModel())
    }
}

但是,我得到一个错误:

代码语言:javascript
运行
复制
Cannot convert return expression of type '_ModifiedContent<ContentView, _EnvironmentKeyWritingModifier<DataModel?>>' to return type 'ContentView'

错误是因为WKHostingController是一个泛型,需要一个具体的类型-本例中为WKHostingController<ContentView>

类似的方法也适用于iOS应用程序中的UIHostingController,因为UIHostingController不是泛型类。

是否有其他方法可以将环境注入到watchOS视图?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-12 14:28:26

您可以使用类型擦除,在SwiftUI View的情况下使用AnyView

我会重构WKHostingController以返回AnyView

这似乎在我这一端编译得很好。

代码语言:javascript
运行
复制
class HostingController : WKHostingController<AnyView> {
    override var body: AnyView {
        return AnyView(ContentView().environmentObject(DataModel()))
    }
}
票数 54
EN

Stack Overflow用户

发布于 2019-09-15 06:36:00

对于像Brett (在评论中)这样的人来说

代码语言:javascript
运行
复制
"Property 'body' with type 'AnyView' cannot override a property with type 'ContentView'"

我得到了相同的错误,因为我没有替换返回值并包装返回的ContentView。

即。这就是我第一次尝试的样子..请注意应该为WKHostingController<AnyView>WKHostingController<ContentView>

代码语言:javascript
运行
复制
class HostingController : WKHostingController<ContentView> {
    override var body: AnyView {
        return AnyView(ContentView().environmentObject(DataModel()))
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-09 04:45:53

除了Matteo很棒的回答之外,

如果你想使用委托,那么就像这样使用:

代码语言:javascript
运行
复制
class HostingController : WKHostingController<AnyView> {
    override var body: AnyView {
        var contentView = ContentView()
        contentView.environmentObject(DataModel())
        contentView.delegate = self
        let contentWrapperView = AnyView(contentView)
        return contentWrapperView
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56555709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档