[英]View Controllers, Dependency Injection, and init/viewDidLoad
我已经读了很多关于SO的答案,但是我有些困惑。
我创建了一个标签栏控制器子类,并在其viewDidLoad中创建了每个视图控制器。 但是,我有一个要传递给父级的依存关系,然后又传递给每个选项卡的视图控制器。 我通过自定义init方法(在标头中为此声明的NS_DESIGNATED_INITIALIZER)传递了该依赖关系。 但是,看起来[super init]
直接触发viewDidLoad,因此在创建其他视图控制器时,依赖项设置不正确。
这是我的自定义init方法:
- (instancetype)initWithSession:(T2Session *)session
{
self = [super init];
if (self) {
_session = session;
}
return self;
}
我希望在创建视图控制器时设置session
,但是我对实现此目的的最佳方法感到困惑。 任何建议深表感谢。 提前致谢!
我以前遇到过这种情况。
您可能像我一样坐在那里,希望viewDidLoad
不会这么快被调用。
无论如何,这就是我所决定的:
- (instancetype)initWithSession:(T2Session *)session {
if (self = [super init]) {
self.session = session;
}
return self;
}
- (void)setSession:(T2Session *)session {
_session = session;
... call the setup methods here, instead of viewDidLoad
}
起初,我认为这打破了不从初始化程序中调用self.xxxx
的黄金法则 。
但是,我认为该规则仅在尚未连接的IBOutlet上调用方法时才真正相关。
在这种情况下, T2Session *session
不是笔尖出口。
另外,如果您不希望违反该规则,则可以始终删除自定义初始化程序..并恢复为使用常规属性注入而不是构造函数注入。 例如
T2Session *session = .....
MYTabBarController *tabBarController = [[MYTabBarController alloc] init];
[tabBarController setSession:session];
这些只是我的想法,希望对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.