2015-04-15 5 views
2

Я использую разные раскадровки для разных прецедентов. Мой вопрос в том, как я могу создать экземпляр раскадровки, контроллер представления по его идентификатору раскадровки и подключить его к реальному классу viewcontroller?Как использовать несколько раскадровки, определенных в сборках?

Вот где я сейчас:

public dynamic func loadingViewController() -> AnyObject { 
    return TyphoonDefinition.withClass(LoadingViewController.self) { 
     (definition) in 

     definition.injectProperty("presenter", with: self.loadingPresenter()) 
    } 

//  return TyphoonDefinition.withFactory(self.storyboard(), selector: "instantiateViewControllerWithIdentifier:") { 
//   (factory) in 
//    
//   factory.injectParameterWith("LoadingViewController") 
//    
//  } 
} 

public dynamic func storyboard() -> AnyObject { 
    return TyphoonDefinition.withClass(TyphoonStoryboard.self) { 
     (definition) in 

     definition.useInitializer("storyboardWithName:factory:bundle:") { 
      (initializer) in 

      initializer.injectParameterWith("Loading") 
      initializer.injectParameterWith(self) 
      initializer.injectParameterWith(NSBundle.mainBundle()) 
     } 

     definition.scope = TyphoonScope.Singleton 
    } 
} 

В этом примере имя раскадровка является «Загрузка», то ViewController является «LoadingViewController» и идентификатор раскадровки также 'LoadingViewController.

Любая помощь (или пример кода) будет оценена!

+0

Вот как выглядит раскадровка: [Раскадровка] (http://home.sch.bme.hu/~abicska/upload/typhoon_2.png), и вот как выглядит работающее приложение: [App] (http://home.sch.bme.hu/~abicska/upload/typhoon_1.png). Таким образом, «LoadViewController» не загружается. Я действительно не знаю, где я должен назвать функцию раскадровки(), упомянутую выше. – abelorosz

+0

На самом деле я не могу найти, где проблема, так как вы можете увидеть, что раскадровка загружена и представлен навигационный контроллер, но контроллер rootViewController контроллера навигации не установлен, насколько я могу видеть – abelorosz

+0

@ JasperBlues в порядке, поэтому я прошел образец кода снова. Не могли бы вы рассказать мне, как я могу установить фабрику определения класса в раскадровку? Поскольку параметр 'definition.factory' уже давно исчез. Пример кода основан на Typhoon 2, и они написали что-то вроде этого: 'definition.factory = [определение раскадровки]' Спасибо – abelorosz

ответ

2

Чтобы создать TyphoonDefinition, представляющий UIViewController, который будет излучаемый из раскадровки:

Создать определение для раскадровки:

- (UIStoryboard *)storyboard 
{ 
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] 
     configuration:^(TyphoonDefinition *definition) { 

     [definition useInitializer:@selector(storyboardWithName:factory:bundle:) 
      parameters:^(TyphoonMethod *initializer) { 
       [initializer injectParameterWith:@"StoryboardName"]; 
       [initializer injectParameterWith:self]; 
       [initializer injectParameterWith:[NSBundle mainBundle]]; 
      }]; 
    }]; 
} 


Если вы хотите для создания экземпляра контроллера, отмеченного как «начальный» контроллер в раскадровке:

- (UIViewController *)initialControllerFromStoryBoard 
{ 
    return [TyphoonDefinition withFactory:[self storyboard] 
     selector:@selector(instantiateInitialViewController)]; 
} 


Если вы хотите, чтобы создать экземпляр другой контроллер в раскадровку:

- (UIViewController *)arbitraryControllerFromStoryboard 
{ 
    return [TyphoonDefinition withFactory:[self storyboard] 
     selector:@selector(instantiateViewControllerWithIdentifier:) 

     parameters:^(TyphoonMethod *factoryMethod) { 
      [factoryMethod injectParameterWith:@"ViewControllerId"]; 
     }]; 
} 

Извините за ответ в Objective-C, но я не получил мой Swift отбивные на данный момент.

+1

Большое спасибо за вашу помощь! Это решение. – abelorosz