故事板要求在内部实例化视图控制器,这使得依赖注入视图控制器变得困难。可以通过继承Storyboard并重写-instantiateViewControllerWithIdentifier:
方法,在实例化之后立即执行配置工作来解决这个问题。用于创建初始视图控制器的故事板实例将被用于通过segues访问的进一步视图控制器。
此库提供了一个Storyboard子类BlindsidedStoryboard
,它利用了这项技术,与Blindside
DI框架集成。它包含了一个小样应用,展示了其如何使用。
可以包含BlindsidedStoryboard(CrossStoryboardSegues)
类别,以便与Cross Storyboard Segues无缝集成。Xcode 7的原生Storyboard引用也得到了支持,在切换故事板时将继续使用相同的注入器。
当您创建一个Storyboard实例以显示视图控制器时,只需这样做
id<BSInjector> injector = [Blindside injectorWithModule:[[MyBlindsideModule alloc] init]];
UIStoryboard *storyboard = [BlindsidedStoryboard storyboardWithName:@"Main" bundle:nil injector:injector];
UIViewController *viewController = [storyboard instantiateInitialViewController];
let injector = Blindside.injectorWithModule(MyBlindsideModule)
let storyboard = BlindsidedStoryboard("Main", bundle: nil, injector: injector)
let viewController = storyboard.instantiateInitialViewController()
BlindsidedStoryboard
将确保在将其返回给您之前向viewController中注入依赖项。有几个注意事项
-initWithCoder:
实例化视图控制器,因此需要使用+bsProperties
来指定类的依赖项。-awakeFromNib
之后才可用。-bsAwakeFromPropertyInjection
中放置需要在依赖项注入后执行的工作。BlindsidedStoryboard通过CocoaPods提供。要安装它,只需将以下行添加到Podfile中:
pod "BlindsidedStoryboard"
如果您针对的是iOS 8.0或更高版本,还可以将其作为框架使用Carthage安装。要这样做,请将以下行添加到Cartfile中:
github "briancroom/BlindsidedStoryboard"
Brian Croom, [email protected]
BlindsidedStoryboard可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。