ios - View Controller 、依赖注入(inject)和 init/viewDidLoad

标签 ios objective-c uiviewcontroller dependency-injection initialization

我已经阅读了很多关于 SO 的答案,但我有点困惑。

我创建了一个选项卡栏 Controller 子类,在它的 viewDidLoad 中,我创建了每个 View Controller 。但是,我有一个要传递给父级的依赖项,然后传递给每个选项卡的 View Controller 。我正在使用自定义初始化方法(在 header 中为其声明的 NS_DESIGNATED_INITIALIZER)传递该依赖项。但是,看起来 [super init] 直接触发 viewDidLoad,因此在创建其他 View Controller 时没有正确设置依赖项。

这是我的自定义初始化方法:

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

    if (self) {
        _session = session;
    }

    return self;
}

我希望在我创建 View Controller 时设置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 不是 nib socket 。

或者,如果您不想违反该规则,您可以随时删除自定义初始化程序..并恢复使用常规属性注入(inject)而不是构造函数注入(inject)。例如

T2Session *session = .....

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

这些只是我的想法,希望对你有帮助。

关于ios - View Controller 、依赖注入(inject)和 init/viewDidLoad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398604/

相关文章:

ios - 将 CSV 文件保存到文档目录文件夹

ios - 在 SWIFT 中的不同 View 之间切换

ios - Swift ios 检查哪个 View Controller 存在

ios - UISplitViewController - 用作滑出式菜单

objective-c - IBOutlet 和 IBAction

objective-c - 找到 iOS 7 UDID 的任何其他选项?

iphone - 每个细节 View Controller 一个计时器

ios - 核心数据错误 SIGABRT : keypath AttributeName not found in entity <NSSQLEntity EntityName id=2>

ios - 用于将 URL 与视频 ID 匹配的正则表达式

iOS :put the id type as string to print