gpt4 book ai didi

swiftui - 在 SwiftUI 中找不到子形状的 EnvironmentObject

转载 作者:行者123 更新时间:2023-12-04 01:29:59 30 4
gpt4 key购买 nike

我遇到以下 SwiftUI 错误 @EnvironmentObject与自定义 Shape 一起使用时, :

Fatal error: No ObservableObject of type MyObject found. A View.environmentObject(_:) for MyObject may be missing as an ancestor of this view.: file SwiftUI, line 0

只有当我使用任何 Shape 时才会发生这种情况返回实例的新副本的方法,例如 stroke() .

这是一个重现的 Swift 游乐场示例:
import SwiftUI
import PlaygroundSupport

class MyObject: ObservableObject {
@Published var size: Int = 100
}

struct MyShape: Shape {
@EnvironmentObject var envObj: MyObject

func path(in rect: CGRect) -> Path {
let path = Path { path in
path.addRect(CGRect(x: 0, y: 0,
width: envObj.size, height: envObj.size))
}
return path
}
}

struct MyView: View {
var body: some View {
MyShape().stroke(Color.red) // FAIL: no ObservableObject found
// MyShape() // OK: it works
}
}

let view = MyView().environmentObject(MyObject())
PlaygroundPage.current.setLiveView(view)

由于看起来环境字段没有被复制,我也尝试像这样明确地这样做:
struct MyView: View {
@EnvironmentObject var envObj: MyObject

var body: some View {
MyShape().stroke(Color.red).environmentObject(self.envObj)
}
}

它仍然失败。作为一个 SwiftUI 初学者,我不知道这是否是预期的行为,不继承 View 层次环境,以及如何处理它 - 除了不使用环境。

任何的想法?

最佳答案

问题实际上是 .stroke在构造函数之后调用,所以在 environmentObject 之前注入(inject)(如果您注释掉中风,您可以测试它是否有效)。但是.stroke注入(inject)环境对象后无法添加,因为 .strokeShape-only修饰符。

解决方案是在构造过程中注入(inject)依赖项,如下所示。使用 Xcode 11.4/iOS 13.4 测试

struct MyShape: Shape {
@ObservedObject var envObj: MyObject
...
}

struct MyView: View {
@EnvironmentObject var envObj: MyObject
var body: some View {
MyShape(envObj: self.envObj).stroke(Color.red)
}
}

关于swiftui - 在 SwiftUI 中找不到子形状的 EnvironmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225841/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com