我在这里使用了RESideMenu故事板示例项目下载,但是我不知道如何将在AppDelegate中创建的managedObjectContext注入主视图控制器,例如RESideMenu显示的HomeViewController。
发布于 2014-04-20 17:29:47
首先,我的建议是避免出现问题,如果您想使用DI,不要使用故事板。
如果您想使用它们,视图控制器是由情节提要创建的,因此构造函数注入是不可能的,所以我假设您使用的是setter注入。
一个简单的解决方案是在视图控制器的上下文getter中获取应用程序委托的上下文,如下所示:
// .h
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
// .m
- (NSManagedObjectContext *) managedObjectContext
{
if(_managedObjectContext == nil)
{
_managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
return _managedObjectContext;
}是的,这不是DI,因为视图控制器正在寻找上下文,而不是请求上下文,但并不是很糟糕,它仍然允许您在测试中轻松地注入不同的上下文。
另一种解决方案是在您的respondsToSelector:@selector(setManagedObjectContext)),子类中重写instantiateViewControllerWithIdentifier:并在那里注入上下文,但是您需要某种方式来检查请求的视图控制器是否需要上下文(您可以使用UIStoryboard,也可以在情节提要子类中使用上下文(您可以像上面的代码那样注入它或访问它)。检查这个问题以查看类似的方法,但使用台风。
最后要说的是,在视图控制器中注入上下文很容易最终产生巨大的视图控制器,我会在其他模型对象中注入上下文,然后在视图控制器中注入上下文。
https://stackoverflow.com/questions/23181972
复制相似问题