2014-10-31 69 views
3

我想用故事板創建一個名爲「孩子」視圖控制器,所以我定義:颱風利用與故事板視圖控制器的初始化

- (TyphoonStoryboard *)storyBoard 
{ 
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) { 
     [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:@"Storyboard"]; 
      [initializer injectParameterWith:self]; 
      [initializer injectParameterWith:[NSBundle mainBundle]]; 
     }]; 
     definition.scope = TyphoonScopeSingleton; //Let's make this a singleton 
    }]; 
} 

- (ChildViewController *)childViewControllerFromStoryboard 
{ 
    return [TyphoonDefinition withFactory:self.storyBoard selector:@selector(instantiateInitialViewController)]; 
} 

我必須將包含子視圖根視圖控制器控制器

- (RootViewController *)rootViewController { 
    return [TyphoonDefinition withClass:[RootViewController class] configuration:^(TyphoonDefinition *definition) { 
     [definition useInitializer:@selector(initWithChildViewController:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:self.childViewControllerFromStoryboard]; 
     }]; 
    }]; 
} 

最後一部分是剛注入的子視圖控制器的依賴關係:

- (ChildViewController *)childViewController { 
    return [TyphoonDefinition withClass:[ChildViewController class] configuration:^(TyphoonDefinition *definition) { 
     // Initilization doesn't work. 
     [definition useInitializer:@selector(initWithData:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:self.data]; 
     }]; 
     // Property injection does. 
     // [definition injectProperty:@selector(data)] 
    }]; 
} 

超級正常,我只是使用它的初始化器,但它永遠不會被調用。我認爲這是因爲總是使用initWithCoder:,故事板指定的那個。

問題:

  1. 可以使用視圖控制器的初始化故事板?它看起來不是,類似於AppDelegate。
  2. 這是從裝配中直接使用故事板的最簡單方法嗎?
  3. 如果我有幾個故事板,是否有參數化定義故事板的方法?我不想最終得到像storyBoard1, storyBoard2, ..., storyBoardN這樣的東西。

在此先感謝。

回答

5

感謝您對臺風的關注!

  1. 可以使用視圖控制器的初始化故事板?它看起來不是,類似於AppDelegate。

不,你不能初始化對象兩次(你可以調用init方法兩次,但很奇怪和不正確的,可以是錯誤的原因)。

從Xib/Storyboard創建的每個UIViewController和UIView都使用initWithCoder:初始化方法。

相反,您可以使用方法注入並注入setData:或使用屬性注入。

  1. 這是直接從程序集中使用故事板的最簡單方法嗎?

不是。最簡單的方法是使用plist bootstrapping。 (當在Info.plist中指定的初始故事板名稱)

檢查指導這裏:

https://github.com/typhoon-framework/Typhoon/wiki/Obtaining-Built-Components#first-bootstrap-typhoon-using-either

但如果你有不止一個故事板,那麼你可以指定的plist初始,和其他在部件。

  1. 如果我有幾個故事板,是否有參數化定義故事板的方法?我不想結束像storyBoard1,storyBoard2,...,storyBoardN。

是的,你可以使用運行參數對於颱風的功能。 使用運行時參數的定義變得

- (TyphoonStoryboard *)storyBoardWithName:(NSString *)name 
{ 
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) { 
     [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:name]; // <-- runtime argument injection 
      [initializer injectParameterWith:self]; 
      [initializer injectParameterWith:[NSBundle mainBundle]]; 
     }]; 
    }]; 
} 

難道你問什麼?

+0

感謝您的及時響應!關於答案: 1.完全可以。 2.我已經在使用plist,但仍然需要創建一個包含故事板中VC的根VC。 3.我已經嘗試過了,但它在'validateScope'中引發了一個異常,說「運行時參數注入只適用於原型和對象圖的作用域定義,但爲定義設置:TyphoonStoryboard」 – 7ynk3r 2014-10-31 18:29:02

+0

2.您是否正在使用plist故事板(UIMainStoryboardFile plist鍵)?在這種情況下,根視圖控制器自動設置。 3.正確。你確定你在這裏需要單身嗎? Storyboard已經由其生成的viewControllers保留。 – Aleksey 2014-10-31 18:34:03

+0

2.在我的情況下,根視圖控制器是一個沒有故事板的自定義視圖控制器。 3.刪除單例作用域後,我收到'doRegistration'中的錯誤'Key'storyboardWithName:'已經註冊了' – 7ynk3r 2014-10-31 20:05:10

2

爲了減小代碼故事板定義我最終添加的類別TyphoonDefinition像:

@implementation TyphoonDefinition (Storyboard) 

+ (TyphoonStoryboard *)withStoryboardName:(NSString *)storyboardName factory:(TyphoonComponentFactory *)factory 
{ 
    return [TyphoonDefinition withClass:[TyphoonStoryboard class] configuration:^(TyphoonDefinition* definition) { 
     [definition useInitializer:@selector(storyboardWithName:factory:bundle:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:storyboardName]; 
      [initializer injectParameterWith:factory]; 
      [initializer injectParameterWith:[NSBundle mainBundle]]; 
     }]; 
     definition.scope = TyphoonScopeSingleton; //Let's make this a singleton 
    }]; 
} 

@end 

因爲這是它不註冊一次以上的組件之外。

+0

我對了嗎在假設爲工廠參數,你只需傳遞'self'? – fatuhoku 2015-02-14 17:16:12

相關問題