2009-03-05 21 views
8

我有一個具有根視圖控制器,主視圖控制器和輔助視圖控制器的應用程序。我希望能夠從輔助視圖控制器發送消息到主視圖控制器。我如何獲得對主要的參考,以便我可以發送消息給它?有沒有更好的方法來設計這個?在iPhone上構建多視圖應用程序

回答

0

如果控制器是從NIB加載的,則可以在輔助控制器上定義一個插座並將其連接到接口構建器中的主控制器。

7

答案很簡單:你可以回到你的應用程序委託是這樣的:

YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

你可能已經有了一個指向你的根視圖控制器在您的應用程序委託類。而且你可能有指向根控制器對象中主要和次要視圖控制器的指針。所以,你可以這樣寫代碼:

SecondaryViewController *primary = delegate.rootController.primaryController; 

然後,你可以發送消息到你的心臟的內容。沒有需要的網點;只是屬性到每個視圖控制器。

有很多更長的答案,並且還討論了爲什麼這種做法可能有問題,因爲它引入了對象之間可能不想要的聯繫。在一個「純粹的」面向對象的設計中,你將遵循一個乾淨的設計模式,在不同方向的對象之間有明確的聯繫,這樣可以更好地重用代碼。

另一種選擇是將指針傳遞給類將在初始化時需要的對象。爲視圖控制器類實現一個新的initWithSomethingOrOther,並以參數形式傳遞對象。緩存你需要的這些指針(不要忘記保留它們)以備後用。

4

的清潔方式做到這一點是定義一個協議,用於輔助控制器委託其中列出它需要主控制器提供的方法:

@protocol SecondaryControllerDelegate <NSObject> 
- (void)secondaryController:(SecondaryController*)secondaryController 
      frobFooWithBar:(Bar*)myBar; 
- (BOOL)secondaryController:(SecondaryController*)secondaryController 
      shouldTwiddleBaz:(Baz*)currentBaz; 
@end 

現在委託屬性添加到SecondaryController:

@interface SecondaryController : UIViewController { 
    id <SecondaryControllerDelegate> delegate; 
    ... 
} 

// delegates are one of the few places you don't retain an object 
@property (assign) id <SecondaryControllerDelegate> delegate; 
... 

在SecondaryController的實現部分中,合成委託屬性。 (而不是在析構函數中釋放它。)當SecondaryController需要與PrimaryController進行通信時,它應該在委託上調用適當的方法。

現在使你的PrimaryController實現SecondaryControllerDelegate協議:

@interface PrimaryController : UIViewController <SecondaryControllerDelegate> { 
... 

實現PrimaryController委託方法。

最後,讓您的PrimaryController自己設置爲SecondaryController的委託。你究竟如何做到這一點將取決於你是否在一個筆尖創建SecondaryController。如果你這樣做,在那裏建立連接;如果沒有,請在分配並初始化SecondaryController之後進行。

你爲什麼要做這首歌和跳舞?那麼,當你必須在小學和中學之間引入另一個控制器,或者在應用程序的其他地方使用輔助,或者甚至使用另一個應用程序(我的四個應用程序中有三個使用了一個控制器)時,你根本不需要改變SecondaryController;你只需要改變現在應該成爲代表的任何類。從長遠來看,這是一個令人難以置信的節省時間。

0

使用NSNotificationCenter進行對象之間的分離通信。

+0

對於NSNotificationCenter爲+1。 – 2010-01-08 17:16:11

相關問題