台风注入财产

时间:2014-07-03 08:58:04

标签: ios objective-c inject typhoon

我在注入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用法的假设是错误的。

2 个答案:

答案 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的答案显示了一种解决方法。