2013-12-10 3 views
1

Я хочу ввести представление в свой контроллер представления, чтобы я мог вводить макет в мои модульные тесты (WPDependencyInjectorImplementation - мой подкласс TyphoonAssembly).Typhoon - Как вставить UIView, определенный в файле xib?

Мой идеальный loadView метод будет выглядеть следующим образом:

- (void)loadView { 
    WPDependencyInjectorImplementation *injectorAssembly = (WPDependencyInjectorImplementation *) [TyphoonAssembly defaultAssembly]; 
    self.view = [injectorAssembly someView]; 
} 

Я не уверен, что определение это будет выглядеть, или это возможно, учитывая, что код для создания представления из XIb заключается в следующем:

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"WPSomeView" owner:nil options:nil]; 
return [views firstObject]; 

ответ

1

Это право просто переопределить loadView, а не глядя на вид из контейнера, как вы показали, вы должны обеспечить представление через инициализатор или имущество сеттера. А потом в loadView, установите его в нагнетаемой зрения следующим образом:

- (void)loadView 
{ 
    [self.view = _myInjectedView]; //Do this rather than looking it up via the TyphoonFactory - easier to test. 
} 

Если вы делаете это таким образом:

  • Вы можете обратиться к представлению через его фактический тип, а не вниз литья от UIView
  • В чистом модульном тесте это будет очень просто. (Нет необходимости в TyphoonPatcher, swizzling и т. Д.).

Вот пример:

- (id)userDetailsController 
{ 
    return [TyphoonDefinition withClass:[UserDetailsController class] initialization:^(TyphoonInitializer* initializer) 
    { 
     initializer.selector = @selector(initWithSession:userDetailsView:); 
     [initializer injectWithDefinition:[self session]]; 
     [initializer injectWithDefinition:[self userDetailsView]]; 
    }]; 
} 

- (id)userDetailsView 
{ 
    return [TyphoonDefinition withClass:[UserDetailsView class] 
     properties:^(TyphoonDefinition* definition) 
    { 
     //circular dependency. Can also be set within VC. 
     [definition injectProperty:@selector(delegate) 
      withDefinition:[self userDetailsController]]; 
     [definition injectProperty:@selector(sideMargin) 
      withValueAsText:@"${view.field.default.side.margin}"]; 
    }]; 
} 

Инъекция С XIb

Мы фактически не имеем фабрику XIb мы можем предоставить вам еще. Должна быть краткая работа по определению одного с использованием аналогичного шаблона для объекта, который испускает тему here, поэтому у вас будет компонент в контейнере DI для каждого из ваших представлений на основе Xib и просто введите это прямо.

В качестве альтернативы вы можете использовать наш новый TyphoonFactoryProvider.

Если вы застряли, сообщите нам об этом, и один из нас найдет время для создания и продвижения этой Xib-view-factory для вас.

+0

Спасибо за совет, я пошел с введенным взглядом, и я думаю, что это определенно лучше для тестирования. Я рассмотрю ваши предложения по загрузке xib-views. – titch

+0

добро пожаловать. Если вам нужна помощь на фабрике xib-view, пожалуйста, зарегистрируйте проблему в GitHub, и у нас будет одна созданная. В противном случае, если вы это сделаете сами, нам бы понравился запрос на тянуть на самом деле. –

Смежные вопросы