简体   繁体   中英

Swift @ObservedObject initialize with another property

EDIT added the source code showing declaration of the variables

I am trying to initialize a view model property which is an @ObservedObject @ObservedObject private var viewmodel: ExpenseListViewModel

I want to initialize the view model with a repostitory which is going to accept the ManagedObjectContext as a parameter in the constructor

Since viewmodel has a prperty wrapper it is not allowing to create it as a computed property either.

when i tried to initialize the Repository and viewmodel in the init i get an self is used before being initialized

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 )
    }
}

The @Environment is not available on init call phase, it is injected later. So here is possible solution:

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 )
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM