0

我想显示一个存储在 EnvironmentObject 中的图像(类型 UIImage)。此 EnvironmentObject 包含一个包含 UIImage 元素的结构数组。在一个视图中,我想显示这个数组的图像,但这不起作用。

这是结构:

struct TestStruct: Identifiable {
    var id: String
    var name: String
    var image: UIImage

    init() {
        id = ""
        name = ""
        image = UIImage.init()
    }
}

这里是 ModelData 类:

final class ModelData: ObservableObject {
    @Published var testStruct: [TestStruct] = []
}

这是主应用程序代码中 modelData 的实例化:

struct TestApp: App {
    @ObservedObject private var modelData = ModelData()
    init() {...

modelData 的内容是从 Firebase 数据库和 Firebase 存储中加载的。这实际上有效,我可以在调试预览中的 modelData.testStruct[...].image 中看到下载的图像。

从一个视图来看,我想引用来自modelData的图像:

struct StructContentView: View {
    @EnvironmentObject var modelData: ModelData

    var body: some View {
        ScrollView {
            Image(uiImage: modelData.testStruct[0].image)
                .frame(width: 64.0, height: 64.0)
                .foregroundColor(.red)           
        }
    }
}

有人能帮我吗?我通常对 ObservableObject/EnvironmentObject 和那些东西感到困惑,但我能够在 TextView 中显示例如 modelData.testStruct[0] 的字段“名称”。将 UIImage 传递给 Image 视图是否错误,也许?还是那里需要其他东西?

4

1 回答 1

0

在 Firestone 的 getData 完成回调中,设置了:

let reference = Storage.storage().reference(forURL: tempStruct.imageUrl)
                                reference.getData(maxSize: (1 * 1024 * 1024)) { (data, error) in
    if let _error = error{
      print(_error)
    } else {
      if let _data  = data {
        tempStruct.image = UIImage(data: _data)!
      }
    }
}

...

modelData.testStruct.append(tempStruct)

这是在应用程序启动时完成的。当用户转到另一个菜单项时,图像将/应稍后显示。

解决方案:

testStruct 类型的图像必须更改为@Published,因此还需要将 testStruct 更改为类:

class TestStruct: ObservableObject {
    var id: String
    var name: String
    @Published var image: UIImage

    init() {
        id = ""
        name = ""
        image = UIImage.init()
    }
}
于 2021-12-23T17:50:43.033 回答