2014-04-20 342 views

回答

1

首先,我的建議是爲了避免出現問題,如果你想使用DI不要用故事板。

如果你想使用它們,都是由故事板創建的視圖控制器,因此構造函數注入是不可能的,所以我假設你正在使用setter注入。

一個簡單的辦法是讓應用程序委託的的背景下,在您的視圖控制器的上下文吸氣這樣的:

// .h 

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

// .m 

- (NSManagedObjectContext *) managedObjectContext 
{ 
    if(_managedObjectContext == nil) 
    { 
     _managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    } 

    return _managedObjectContext; 
} 

是的,這不是DI因爲視圖控制器正在尋找的範圍內,而不是請求因爲它不是很糟糕,它仍然允許你在測試中輕鬆地注入不同的上下文。

另一個解決方案是重寫instantiateViewControllerWithIdentifier:在UIStoryboard子和注入的背景下出現的,但你會需要一些方法來檢查請求的視圖控制器需要上下文或沒有(你可以使用respondsToSelector:@selector(setManagedObjectContext) ),並且您還需要故事板子類中的上下文(您可以注入它或像上面的代碼中那樣訪問它)。檢查this question看到類似的方法,但使用Typhoon

最後要說的是,在一個視圖控制器注入方面很容易出現最終擁有巨大的視圖控制器,我會注入其他模型對象的背景,然後注入這些在您的視圖控制器。

+0

感謝的建議,我認爲這個故事板似乎開始使用IOS開發(第一次嘗試在一個應用程序)的好辦法,但我看到你在DI限制方面的意思。我想我會回去做沒有故事板的一次。 當你說'我會在其他模型對象中注入上下文,然後將它們注入到視圖控制器中。我想最好的辦法是創建一個提供與上下文的基本查詢/功能注入到視圖控制器 –

+0

關於故事板的一類,是品味的問題,事實上,他們有一些優點,但是是當它涉及到他們使事情變得更復雜一點。無論如何,像颱風這樣的工具可以幫助你,就像你在這個問題中看到的那樣。而且你對上下文是正確的,最好是讓其他類處理查詢和其他業務邏輯,以保持視圖控制器的完整性。 – e1985