查看控制器,依赖注入和init / viewDidLoad

时间:2015-02-08 19:51:11

标签: ios objective-c uiviewcontroller dependency-injection initialization

我已经在SO上阅读了很多答案,但我有点困惑。

我有一个我创建的标签栏控制器子类,在其viewDidLoad中,我正在创建每个视图控制器。但是,我有一个依赖项,我将传递给父项,然后进入每个选项卡的视图控制器。我正在使用自定义init方法(在标头中为其声明的NS_DESIGNATED_INITIALIZER)传递该依赖项。但是,看起来[super init]直接触发viewDidLoad,因此在创建其他视图控制器时未正确设置依赖关系。

这是我的自定义init方法:

- (instancetype)initWithSession:(T2Session *)session
{
    self = [super init];

    if (self) {
        _session = session;
    }

    return self;
}

我希望在创建视图控制器时设置session,但我有点担心最好的方法是什么。任何建议都非常感谢。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我之前遇到过这种情况 你可能坐在那里(像我一样)希望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不是笔尖出口。

或者,如果您不想破坏该规则,则可以始终删除自定义初始值设定项..并恢复使用常规属性注入而不是构造函数注入。 e.g。

T2Session *session = .....

MYTabBarController *tabBarController = [[MYTabBarController alloc] init];
[tabBarController setSession:session];

这些只是我的想法,希望它有所帮助。