我在注入BOOL属性方面遇到了问题。
我接下来试过了:
- (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(BOOL)isFirst
{
return [TyphoonDefinition withClass:[MDEmotionViewController class]
configuration: ^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(initWithAnalytics:) parameters: ^(TyphoonMethod *initializer) {
[initializer injectParameterWith:[_services analytics]];
}];
[definition injectProperty:@selector(setItem:) with:item];
[definition injectProperty:@selector(setFirstController:) with:[NSNumber numberWithBool:isFirst]];
}];
}
但它在运行时与EXC_BAD_ACCESS
崩溃。实际上它与BOOL属性无关,而是具有值本身的注入属性。看起来我对Typhoon
用法的假设是错误的。
答案 0 :(得分:4)
运行时参数必须始终是对象 - 而不是基本类型!
正确的装配在这里:
- (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(NSNumber *)isFirst
{
return [TyphoonDefinition withClass:[MDEmotionViewController class]
configuration: ^(TyphoonDefinition *definition) {
[definition useInitializer:@selector(initWithAnalytics:) parameters: ^(TyphoonMethod *initializer) {
[initializer injectParameterWith:[_services analytics]];
}];
[definition injectProperty:@selector(setItem:) with:item];
[definition injectProperty:@selector(setFirstController:) with:isFirst];
}];
}
其中firstController属性可以有BOOL,但是当调用assmebly接口时,你必须使用NSNumber包装器:
[assembly emotionControllerWithItem:item firstController:@YES];
答案 1 :(得分:1)
一般来说,您可以按如下方式注入:
[definition injectProperty:@selector(isFirst) with:[NSNumber numberWithBool:YES]];
但可能更好:
[definition injectProperty:@selector(isFirst) with:@(YES)];
但是,运行时参数具有以下限制:
您可以解决此问题,也可以回退编写自己的工厂类来代替程序集界面。
@Aleksey的答案显示了一种解决方法。