使用故事板时覆盖默认初始值设定项(构造函数依赖注入)

时间:2014-04-23 10:17:59

标签: ios objective-c dependency-injection storyboard uistoryboardsegue

当需要在视图控制器之间传递/共享变量(使用故事板)时采用的典型方法是在viewcontroller方法中获取对目标prepareForSegue:的引用,并使用属性注入,如下所示: / p>

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"Segue_Name"])
    {
        // Get reference to the target view controller (optional casting)
        DestinationViewController *vc = (DestinationViewController *)segue.destinationViewController;

        // Pass any objects/properties
        vc.whateverObject = object;
}

}

这种方法的问题(正如我在关于当前项目的域的上下文中看到的那样)是对传递/注入的对象的依赖性不明确。

虽然这种自由(能够在初始化后注入依赖关系)在一些需要灵活性的用例中受到欢迎,但大多数时候我更喜欢安全构造函数注入的感觉。

特别是在像objective-c这样的语言中,传递和发送消息到nil是允许/普通的,在我忘记在正确的位置设置属性的狩猎错误是令人厌烦的,即使有单元测试来支持我。

我想知道的是,是否有办法使用自定义初始化程序,我可以提供所需的参数/依赖项。

有没有办法可以手动控制segue.destinationViewController的初始化?

1 个答案:

答案 0 :(得分:1)

只要我知道你不能。如果您需要自定义初始化,则必须在不使用segue的情况下执行此操作 - 使用init,手动存储DestinationViewController并执行您需要执行的操作pushViewControllerpresentViewController

使用segue的另一个缺点是每次都会重新创建DestinationViewController