gpt4 book ai didi

swift - 如何在 SwiftUI 中观察数组的单个元素

转载 作者:行者123 更新时间:2023-12-04 20:21:25 37 4
gpt4 key购买 nike

假设我有一个 Employee 类,它的图片属性可以被观察到。

internal class Employee: CustomDebugStringConvertible, Identifiable, ObservableObject {
internal let name: String
internal let role: Role
@Published internal var picture: UIImage?
}

使用一个存储员工数组的类。这个数组可能会在以后发生变化,所以它是一个 @Published 属性:
internal class EmployeeStorage: ObservableObject {
@Published internal private(set) var employees: [Employee]
}

现在我有一个使用员工存储的 View 列表:
struct EmployeeList: View {
@ObservedObject var employeeStorage = EmployeeStorage.sharedInstance

var body: some View {
// Uses employeeStorage.employee property to draw itself
}
}

该列表用于内容 View :
struct ContentView: View {
@ObservedObject var employeeStorage = EmployeeStorage.sharedInstance

var body: some View {
// Uses an EmployeeList value
}
}

假设现在 EmployeeStorage 对象的变化改变了雇员数组:这有效地更新了 UI,我可以看到列表更新了新的雇员集合。问题:如果我想在员工的图片属性发生变化时达到同样的效果怎么办?我认为这已经足够了,但在我的情况下(我有一个更复杂的例子),如果员工的图像发生变化,UI 不会更新。怎么做?

最佳答案

您的代码中有几个问题。

  • Employee模型
  • 你的模型应该是一个结构体。
  • 不需要符合ObservableObject .
  • 为什么使用 UIImage !?只需使用 Image如果您从 Web Api 异步获取数据,则可能还有一个 URL。
  • 类似:

  • // Employee Model
    struct Employee: Codable, Identifiable {
    let name: String
    let role: Role
    let imageUrl: String
    let picture: Image
    }
  • EmployeeStorage
  • 我怀疑您使用的方式 EmployeeStorage因为单例是有问题的。 Apple 建议您最好使用 @EnvironmentObject属性来传递 View 及其 subview 之间共享的数据。它 super 简单,但功能强大!

  • 话虽如此,您可以按如下方式修改代码:

    // Employees Store
    final class EmployeeStorage: ObservableObject {
    @Published var employees: [Employee]
    }

    // Content View
    struct ContentView: View {
    var employeeStorage = EmployeeStorage()

    var body: some View {
    ...
    EmployeeList()
    .environmentObject(employeeStorage) // here you pass the storage to the list
    }
    }

    // Employee List
    struct EmployeeList: View {
    @EnvironmentObject var employeeStorage: EmployeeStorage

    var body: some View {
    NavigationView {
    List {
    ForEach(employeeStorage.employees) { employee in
    NavigationLink(
    destination: EmployeeDetail()
    .environmentObject(employeeStorage)
    ) {
    EmployeeRow(employee: employee)
    }
    }.navigationBarTitle(Text("Employees"))
    }
    }
    }
    }

    更多信息,您可以查看 this出去。它已经完成了你要实现的目标。

    关于swift - 如何在 SwiftUI 中观察数组的单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58344149/

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