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对此有何想法?