查看控制器、依赖注入和 init/viewDidLoad
View Controllers, Dependency Injection, and init/viewDidLoad
我已经阅读了很多关于 SO 的答案,但我有点困惑。
我创建了一个标签栏控制器子类,在它的 viewDidLoad 中,我创建了每个视图控制器。但是,我有一个依赖关系,我将其传递到 parent,然后传递到每个选项卡的视图控制器。我使用自定义初始化方法(在 header 中为其声明的 NS_DESIGNATED_INITIALIZER)传递该依赖项。但是,看起来 [super init]
直接触发 viewDidLoad,因此在创建其他视图控制器时没有正确设置依赖项。
这是我的自定义初始化方法:
- (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
的 黄金法则 。
但是,我认为只有在可能尚未连接的 IBOutlets 上调用方法时,该规则才真正相关。
在这种情况下,T2Session *session
不是笔尖出口。
或者,如果您不想违反该规则,您可以随时删除自定义初始化器..并恢复使用常规 属性 注入而不是构造函数注入。例如
T2Session *session = .....
MYTabBarController *tabBarController = [[MYTabBarController alloc] init];
[tabBarController setSession:session];
这些只是我的想法,希望对您有所帮助。
我已经阅读了很多关于 SO 的答案,但我有点困惑。
我创建了一个标签栏控制器子类,在它的 viewDidLoad 中,我创建了每个视图控制器。但是,我有一个依赖关系,我将其传递到 parent,然后传递到每个选项卡的视图控制器。我使用自定义初始化方法(在 header 中为其声明的 NS_DESIGNATED_INITIALIZER)传递该依赖项。但是,看起来 [super init]
直接触发 viewDidLoad,因此在创建其他视图控制器时没有正确设置依赖项。
这是我的自定义初始化方法:
- (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
的 黄金法则 。
但是,我认为只有在可能尚未连接的 IBOutlets 上调用方法时,该规则才真正相关。
在这种情况下,T2Session *session
不是笔尖出口。
或者,如果您不想违反该规则,您可以随时删除自定义初始化器..并恢复使用常规 属性 注入而不是构造函数注入。例如
T2Session *session = .....
MYTabBarController *tabBarController = [[MYTabBarController alloc] init];
[tabBarController setSession:session];
这些只是我的想法,希望对您有所帮助。