Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将故事板与factory模式视图控制器实例化一起使用?_Ios_Cocoa_Factory_Uistoryboard_Encapsulation - Fatal编程技术网

Ios 如何将故事板与factory模式视图控制器实例化一起使用?

Ios 如何将故事板与factory模式视图控制器实例化一起使用?,ios,cocoa,factory,uistoryboard,encapsulation,Ios,Cocoa,Factory,Uistoryboard,Encapsulation,如何使用故事板控制视图控制器的创建?在阅读了关于封装的好处和单例的问题之后,我重构了我的代码。 我使用一个工厂来实例化我的vc并提供它们的依赖项。但现在我想用故事板。有没有办法让情节提要调用工厂方法?目前,当我需要实例化子视图控制器时,我有如下代码: UIViewController *vc = [self.factory buildChildViewController]; 在工厂方法中,所有依赖项都会得到处理: - (UIViewController*) buildChildViewCon

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

为此,您必须子类化
UIStoryBoard
并重写
-instanceeviewcontrollerwhiteIdentifier:
。但是,似乎没有办法将类指定给故事板文件

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


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

我一直在使用本文中所示的方法来使用故事板实现factory模式:

我真正喜欢这种方法的地方是,您可以使用故事板进行依赖项注入,这样我就可以在类之间轻松地传递我的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)
}

使用
prepareforsgue
时,我无法将应用程序作为参数传入,因此我在该类上有一个属性。现在我可以将它传递到方法中,这样就不需要类上的属性了。我个人更喜欢的东西。

谢谢,我可能会尝试妥协。我将让故事板实例化视图&然后在prepareforsgue中,我将视图传递给工厂方法以设置依赖项,等等。