Ios 台风未注入属性(无情节提要)

Ios 台风未注入属性(无情节提要),ios,typhoon,Ios,Typhoon,我无法使用带有initWithNibName:bundle: 例如: 这是我的集会: @implementation AppAssembly - (ViewControllerC *)viewControllerC { return [TyphoonDefinition withClass:[ViewControllerC class] configuration:^(TyphoonDefinition *definition) {

我无法使用带有
initWithNibName:bundle:

例如:

这是我的集会:

@implementation AppAssembly

- (ViewControllerC *)viewControllerC
{
    return [TyphoonDefinition withClass:[ViewControllerC class]
                          configuration:^(TyphoonDefinition *definition) {
      [definition injectProperty:@selector(name) with:@"Injected string"];
    }];
}

@end
ViewControllerA代码:

@implementation ViewControllerA

- (IBAction)buttonAction:(id)sender 
{
    ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil];
    [self.navigationController pushViewController:viewControllerB animated:YES];
}

@end
@implementation ViewControllerA

- (IBAction)buttonAction:(id)sender
{
    ViewControllerB *viewControllerB = [[[AppAssembly new] activate] viewControllerB];
    [self.navigationController pushViewController:viewControllerB animated:YES];
}

@end
ViewControllerB代码:

@implementation ViewControllerB

- (IBAction)buttonAction:(id)sender 
{
    ViewControllerC *viewControllerC = [[ViewControllerC alloc] initWithNibName:@"ViewControllerC" bundle:nil];
    [self.navigationController pushViewController:viewControllerC animated:YES];
}

@end
@implementation ViewControllerB

- (IBAction)buttonAction:(id)sender 
{
    ViewControllerC *viewControllerC = [self.assembly viewControllerC];
    [self.navigationController pushViewController:viewControllerC animated:YES];
}

@end
ViewControllerC代码:

@interface ViewControllerC : UIViewController

@property (copy, nonatomic) NSString *name;

@end

@implementation ViewControllerC

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // Why is this not being injected?
    self.title = self.name;
}

@end
@implementation ViewControllerC

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = self.name;
}

@end
AppDelegate代码:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ViewControllerA *rootViewController = [[ViewControllerA alloc] initWithNibName:@"ViewControllerA" bundle:nil];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];

    return YES;
}

@end
我已经检查了样本,它们与这种方法不同。你能告诉我我做错了什么吗


谢谢。

台风是一个依赖注入容器,这意味着它不会插入、旋转或以其他方式接触您的类。因此,要获得注入依赖项的类的实例,我们必须询问Typhone

为什么不用于故事板?

在使用plist集成时,Typhone注册了TyphonStoryboard而不是UIStoryboard,以根据情节提要中的定义发出实例—其工作原理与普通情节提要类似,具有注入依赖项的额外好处

在其他地方,为了获得注入了依赖项的实例,我们使用汇编接口,并询问Typhone

解决方案步骤:

在部件中添加ViewControllerB的定义。(在Objective-C中,如果愿意,也可以使用自动注入宏)

将属性添加到ViewControllerB:

现在更改实例化ViewControllerC的按钮操作:

现在我的应用程序类取决于我的TyphonaAssembly,如果我不想要它怎么办?


所有Typhone程序集都可以由协议支持,因此应用程序只能看到实例的提供者,而不能看到Typhone。如果您曾经希望从Typhone迁移,只需提供该协议的替代实现,您仍然拥有一个健壮的体系结构

因此,我必须首先向AppAssembly请求一个注入了程序集的viewControllerB实例,然后才能使用它获得viewControllerC实例

AppAssembly代码:

- (ViewControllerB *)viewControllerB
{
    return [TyphoonDefinition withClass:[ViewControllerB class]
                          configuration:^(TyphoonDefinition *definition) {
                              [definition useInitializer:@selector(initWithNibName:bundle:)
                                              parameters:^(TyphoonMethod *initializer) {
                                                  [initializer injectParameterWith:@"ViewControllerB"];
                                                  [initializer injectParameterWith:nil];
                                              }];

                              [definition injectProperty:@selector(assembly) with:self];
                          }];
}

- (ViewControllerC *)viewControllerC
{
    return [TyphoonDefinition withClass:[ViewControllerC class]
                          configuration:^(TyphoonDefinition *definition) {
                              [definition useInitializer:@selector(initWithNibName:bundle:)
                                              parameters:^(TyphoonMethod *initializer) {
                                                  [initializer injectParameterWith:@"ViewControllerC"];
                                                  [initializer injectParameterWith:nil];
                                              }];

                              [definition injectProperty:@selector(name) with:@"Injected string"];
    }];
}
ViewControllerA代码:

@implementation ViewControllerA

- (IBAction)buttonAction:(id)sender 
{
    ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil];
    [self.navigationController pushViewController:viewControllerB animated:YES];
}

@end
@implementation ViewControllerA

- (IBAction)buttonAction:(id)sender
{
    ViewControllerB *viewControllerB = [[[AppAssembly new] activate] viewControllerB];
    [self.navigationController pushViewController:viewControllerB animated:YES];
}

@end
ViewControllerB代码:

@implementation ViewControllerB

- (IBAction)buttonAction:(id)sender 
{
    ViewControllerC *viewControllerC = [[ViewControllerC alloc] initWithNibName:@"ViewControllerC" bundle:nil];
    [self.navigationController pushViewController:viewControllerC animated:YES];
}

@end
@implementation ViewControllerB

- (IBAction)buttonAction:(id)sender 
{
    ViewControllerC *viewControllerC = [self.assembly viewControllerC];
    [self.navigationController pushViewController:viewControllerC animated:YES];
}

@end
ViewControllerC代码:

@interface ViewControllerC : UIViewController

@property (copy, nonatomic) NSString *name;

@end

@implementation ViewControllerC

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // Why is this not being injected?
    self.title = self.name;
}

@end
@implementation ViewControllerC

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = self.name;
}

@end
如您所见,我必须这样做:
ViewControllerB*ViewControllerB=[[[AppAssembly new]activate]ViewControllerB]不确定是否有其他方法。
由于这样做,我能够将程序集注入ViewControllerB,这让我可以这样做:
ViewControllerC*ViewControllerC=[self.assembly ViewControllerC]
然而,我注意到我也可以做
ViewControllerC*ViewControllerC=[[[AppAssembly new]activate]ViewControllerC],因此不确定哪种方法更好。
不管怎样,我想我必须打电话给new并至少激活一次


谢谢。

很抱歉,此代码无法编译。在您的示例中,您正在添加ViewControllerB的定义,并设置为使用带有“ViewControllerC”nib的初始值设定项,可以吗?请记住,我的问题是,当从B推到C时,我想在ViewControllerC上插入属性
name
。对不起,我刚刚在StackOverflow中快速键入了它-我想这可能足以让您获得图片。我现在已经编辑过了。如果有不清楚的地方,请告诉我哪一部分。是的,当从“B”推到“C”时,如果你想得到“C”,你必须向Typhone索要“C”。@fernandospr只是检查你是否仍然有问题,并注意到编辑后(我认为)答案没有任何变化(一定没有保存)。我又编辑了一遍。对此表示歉意。谢谢Jasper,我尝试了你的代码,但我现在在按钮操作上遇到了相同的问题,没有人注入程序集,因此,这一行:
ViewControllerC*ViewControllerC=[self.assembly ViewControllerC]
,只返回nil。我的集合中有什么遗漏吗?我只有两种方法:
-(ViewControllerB*)ViewControllerB{…}
-(ViewControllerC*)ViewControllerC{…}
@Jasper Blues对此有何想法?