【问题标题】:Swift @ObservedObject initialize with another propertySwift @ObservedObject 用另一个属性初始化
【发布时间】:2020-08-03 02:59:53
【问题描述】:

EDIT添加了显示变量声明的源代码

我正在尝试初始化一个视图模型属性,它是一个 @ObservedObject @ObservedObject private var viewmodel : ExpenseListViewModel

我想用一个将接受 ManagedObjectContext 作为构造函数中的参数的存储库初始化视图模型

由于 viewmodel 有一个 prperty 包装器,因此也不允许将其创建为计算属性。

当我尝试在 init 中初始化存储库和视图模型时,我得到一个 self 在被初始化之前被使用

struct ContentView: View {
    @Environment(\.managedObjectContext) private var moc
    private (set) var repo: Repository
    @ObservedObject  private var viewmodel : ExpenseListViewModel 
    init() {
        //let repository = CoreDataRepository(Context: moc)
        repo = CoreDataRepository(Context: self.moc)
        self.viewmodel = .init(repository: repo)
    }
    var body: some View {
        Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
    }
}

【问题讨论】:

  • 能否展示更多代码,repo 和 moc 声明在哪里?
  • 感谢@Asperi 用 swiftui 视图代码更新了问题

标签: swift property-wrapper


【解决方案1】:

@Environment 在初始化调用阶段不可用,稍后注入。所以这是可能的解决方案:

struct ContentView: View {
    @Environment(\.managedObjectContext) private var moc

    var body: some View {
        InternalContentView(context: moc) // context is ready in body
    }

    struct InternalContentView: View {
        @ObservedObject private var viewmodel: ExpenseListViewModel

        init(context: NSManagedObjectContext) {
            self.viewmodel = .init(repository: CoreDataRepository(Context: context))
        }

        var body: some View {
            Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2023-01-21
    相关资源
    最近更新 更多