3

我有一个由故事板驱动的最简单的应用程序。

屏风

我们有一个UINavigationController, 和视图控制器 A 和 B。

A 有一个文本字段,用户应该在其中输入他们的姓名。当用户触摸一个按钮时,它会进入 B,显示“嗨,[NAME]!”

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

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

4

1 回答 1

0

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

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

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

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

        definition.scope = TyphoonScopeWeakSingleton;
    }];
}

然后,您可以将其注入顶视图控制器,以及此堆栈上的任何后续子项。当这个堆栈最终被弹出时,模型对象也将被清理。


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

@interface INFWelcomeController : UIViewController <INFWelcomeViewDelegate>

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

@end

自动装配也可用于集成测试用例。

于 2014-11-24T04:45:46.127 回答