根据应用程序是在iPhone还是iPad上运行,我想注入一个不同的UIViewController,它们都实现了某种协议。我使用多个故事板,所以我为Typhoon创建了这个工厂定义:
- (id <DrawerProtocol>)drawerProtocol {
return [TyphoonDefinition
withFactory:self.storyboardAssembly.mainStoryboard
selector:@selector(instantiateViewControllerWithIdentifier:)
parameters:^(TyphoonMethod *factoryMethod) {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[factoryMethod injectParameterWith:StoryboardIdentifierDrawerIPhone];
}
else {
[factoryMethod injectParameterWith:StoryboardIdentifierDrawerIPad];
}
}
configuration:^(TyphoonFactoryDefinition *definition) {
definition.classOrProtocolForAutoInjection = object_getClass(@protocol(DrawerProtocol));
// Also tried:
// definition.classOrProtocolForAutoInjection = @protocol(DrawerProtocol);
}];
}
StoryboardAssembly提供了对this answer所示的所有故事板的引用。
当为UIViewControllers使用自动注入时,我发现必须设置definition.classOrProtocolForAutoInjection
才能让Typhoon找到正确的工厂。但是,在注入协议时,我无法弄清楚如何设置此变量。
分配object_getClass(@protocol(DrawerProtocol))
会产生以下异常:'NSInvalidArgumentException', reason: 'No components defined which satisify type: 'id<DrawerProtocol>''
。
分配@protocol(DrawerProtocol)
时,会发生这种情况:'NSInvalidArgumentException', reason: '-[Protocol isSubclassOfClass:]: unrecognized selector sent to instance
。
如何自动注入使用工厂实例化的协议?