如何使用具有工厂模式的Storyboard View Controller实例化?

时间:2013-01-24 10:12:07

标签: ios cocoa factory uistoryboard encapsulation

如何使用故事板控制View Controller的创建?在这里阅读了有关封装和封装的好处的信息。单身人士的问题,我重构了我的代码。 我使用工厂来实例化我的vc&为他们提供依赖。但现在我想使用故事板。有没有办法让故事板调用工厂方法?目前,当我需要实例化子视图控制器时,我有这样的代码:

UIViewController *vc = [self.factory buildChildViewController];

并在工厂方法中处理所有依赖项:

- (UIViewController*) buildChildViewController {
    ChildViewController *cvc = [[ChildViewController alloc] initWithNibName:nil bundle:nil];
    [cvc setDatabase:self.database];
    [cvc setQuery:[self buildSomeQuery:cvc]];
    return cvc;
}

2 个答案:

答案 0 :(得分:2)

为此,您必须继承UIStoryBoard并覆盖-instantiateViewControllerWithIdentifier:。但是,似乎无法将类分配给故事板文件。

但是,您可以通过视图控制器中的- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender向控制器提供依赖项。

我认为故事板不是为了重复使用,它只是简化了将可重用组件连接在一起的过程。就OOP而言,这不是一个好的解决方案。

答案 1 :(得分:1)

我一直在使用本文中显示的方法来使用故事板进行工厂模式:

https://medium.com/ios-os-x-development/safer-uiviewcontroller-creation-when-using-storyboards-1915ac2b2c80#.ebor5maq7

我真正喜欢这种方法,就是你可以使用故事板进行依赖注入,这样我就可以在类之间轻松传递dataApi。

此外,我不再需要使用prepareWithSegue。相反,我只是初始化视图:

func didSelectApplication(application: Application) {

    let factory = StoryboardViewControllerFactory(storyboard: UIStoryboard(name: "Main", bundle: nil))
    let applicationController = factory.createApplicationViewController(application, dataApi: dataApi)
    navigationController?.pushViewController(applicationController, animated: true)
}

使用prepareForSegue我无法将应用程序作为参数传递,因此我在类中有一个属性。现在我可以将它传递给方法,该方法已经消除了对类的属性的需要。我个人更喜欢的东西。