如何使用TyphoonStoryboard将数据从一个ViewController传递到下一个ViewController?

时间:2014-11-19 11:13:04

标签: ios typhoon

我得到了一个由故事板提供支持的最简单的应用程序。

Screenie

我们有一个UINavigationController,并查看控制器A和B.

A有一个文本字段,用户应该输入其名称。当用户触摸按钮时,它会切换到B,显示"嗨,[NAME]!"

如何使用Typhoon将用户输入的名称从A传递到B?

使用Typhoon,我认为它可以让我避免使用-prepareForSegue:sender:,这在DI视角下是邪恶的,因为它需要在完全不相关的视图控制器之间进行耦合。 (例如viewControllerB.nameToDisplay = self.textField.text;

1 个答案:

答案 0 :(得分:0)

Typhoon的一个很好的功能是能够将程序集用作混合静态和运行时依赖关系的工厂接口,从而避免了创建自定义工厂的样板。此功能称为Runtime Arguments。但是,由于故事板用于发出视图控制器,因此无法使用:

  • 运行时参数,因为故事板界面没有这个概念。
  • 初始化程序注入,因为从故事板发出的VC使用initWithCoder

可以做的其他事情是在程序集中创建一个可变模型对象,范围为TyphoonScopeWeakSingleton

- (Person *)storyboardModel
{
    return [TyphoonDefinition withClass:[Person class] 
        configuration:^(TyphoonDefinition *definition) {

        definition.scope = TyphoonScopeWeakSingleton;
    }];
}

然后,您可以将此注入到顶层视图控制器以及此堆栈上的所有后续子节点。最终弹出此堆栈时,模型对象也将被清除。


由于Storyboard创建的视图控制器最适用于属性依赖关系,因此您可能希望将这种方法与Typhoon的(仍然是私有的,但在主服务器上可用)自动连接宏一起使用。这节省了创建装配注册和布线规则的时间:

@interface INFWelcomeController : UIViewController <INFWelcomeViewDelegate>

    @property (nonatomic, strong) InjectedClass(Person) model;
    @property (nonatomic, strong) InjectedProtocol(WebClient) client;

@end

自动接线也可用于集成测试用例。