繁体   English   中英

视图控制器,依赖注入和init / viewDidLoad

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM