SwinjectStoryboard icon indicating copy to clipboard operation
SwinjectStoryboard copied to clipboard

SwinjectStoryboard resolves a new instance of View Controller without dependencies

Open gregoripolak opened this issue 5 years ago • 2 comments

I have found an issue with SwinjectStoryboard, I am trying to create two instances of the same view controller: I.E. Here are my dependencies:

container.register(MyViewModeling.self) { r in
    MyViewModel(someDependency)
}
    
container.storyboardInitCompleted(MyVC.self) { r, c in
    c.viewModel = r.resolve(MyViewModeling.self)!
}

Here is an example of how I resolve my instances:

let myVcs = [0,1].map { _ in storyboard.instantiateViewController(withIdentifier: MyVC.Self) }

The issue is that the second instance of MyVC created, doesn't contain a viewModel. Meaning I don't go through the dependency injection process(invoke).

I started investigating, and as it turns out from what I see in SwinjectStoryboard source code, when I get to the actual resolve method, I hit the entry.storage.instance(inGraph: currentObjectGraph), which does find an entry for my VC, and instead of invoking dependency injection, it just returns the VC that I have already instantiated.

gregoripolak avatar Nov 26 '20 14:11 gregoripolak

Anyone?

gregoripolak avatar Dec 10 '20 14:12 gregoripolak

Give this a try perhaps.

container.storyboardInitCompleted(MyVC.self) { r, c in
    c.viewModel = r.resolve(MyViewModeling.self)!
}.inObjectScope(.transient)

https://github.com/Swinject/Swinject/blob/master/Documentation/ObjectScopes.md

teejayhh avatar Jan 27 '21 02:01 teejayhh