2

如何使用情节提要控制视图控制器的创建?在阅读了关于封装的好处和单例的问题之后,我重构了我的代码。我使用工厂来实例化我的 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;
}
4

2 回答 2

2

为此,您必须继承UIStoryBoard并覆盖-instantiateViewControllerWithIdentifier:. 但是,似乎无法将类分配给情节提要文件。

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

我认为故事板不是为了重用而设计的,它只是让你更容易将可重用的组件连接在一起。就 OOP 而言,这不是一个好的解决方案。

于 2013-01-24T11:08:51.117 回答
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我无法将应用程序作为参数传递,所以我在类上有一个属性。现在我可以将它传递给消除了对类属性的需要的方法。我个人更喜欢的东西。

于 2016-08-08T14:21:40.597 回答