2011-02-13 65 views
3

我正在爲iOS設計一個非常簡單的多視圖應用程序,我一直在關注Apress book中的一個很棒的教程。我已經基本上得到了我的rootViewController實例化並與應用程序委託一起顯示,並且我有許多內容viewControllers(6),我想根據用戶輸入交換進出。但是,在本書中,他們使用Interface Builder在放置在rootView中的工具欄上的按鈕上執行開關。它在rootView中激發一個方法,加載新的內容ViewController並顯示它。調用rootViewController在內容視圖(iOS)中切換視圖

我的問題是,我想執行內容視圖切換(位於我的rootViewController實例),但我想用我的內容視圖中的按鈕觸發切換操作(因此無法使用因爲我的文件所有者是我的contentViewController,其引用保存在我的rootViewController中)。

希望我已經解釋得很好,請讓我知道如果我應該詳細說明。我感謝任何幫助!

回答

5

您需要的時候你要麼在自定義init方法或通過創建後,它只是分配給它創建內容視圖向下傳遞到你的根視圖控制器(RootViewController的* RootViewController的)參考:self.contentView.rootViewController =自;

現在在您的內容視圖中,您可以在根視圖控制器中調用相應的方法來執行切換:[self.rootViewController switchView]。然後可以在按下按鈕(IBAction方法)時調用的方法內觸發此調用。

所以這就是你需要做什麼: 1)創建類型RootViewController的

@class RootViewController; 

@interface MyContentViewController : NSObject { 
@private 
    RootViewController *rootViewController; 
} 

@property (retain) RootViewController *rootViewController; 

的內容視圖控制器內的財產,並確保它保留了參考。 2)的合成屬性和回調添加到切換視圖根視圖控制器:

@implementation MyContentViewController 

@synthesize rootViewController; 

- (IBAction) switchView:(id) sender { 
    [rootViewController switchToNextView]; 
} 

-(void) dealloc { 
    [rootViewController release]; 
    [super dealloc]; 
} 

此外鬆開保持在端部參考。

3)指定根視圖控制器到你的RootViewController的裏面的內容視圖:

self.contentViewController = [[[MyContentViewController alloc] 
         initWithNibName:@"ContentView" 
         bundle:nil] autorelease]; 
self.contentViewController.rootViewController = self; 

這應該是所有的。我希望這可以幫助你。

+0

謝謝你,這個工作出很好:) – eriknelson 2011-02-20 20:33:57

2

嗯,你可以簡單地在每個子控制器的調用創建一個IBAction爲:

[self.parentViewController switchToDifferentController:(int) viewNumber] 

,然後實現在你的根switchToDifferentController方法。除了忽略編譯器警告parentView可能不實現該方法,它可能會工作。

但是,這是有點脆弱,因爲你不得不假設它是家長打電話給你,沒有人會忘記實施該方法。

一般情況下,您使用子控制器的「委託」概念來要求其父級執行某些操作。總的想法是,你將一組方法聲明爲「協議」。把它看作是對象之間的契約。一個對象可以說「我保證實現這些方法」,然後另一個對象可以選擇將這些消息發送給它。合同允許編譯器/系統檢查一致性。您將在UITableView中看到這一點,操作系統提供一個標準表,但它會回調您的代碼以根據需要提供單個單元。

要實現一個協議,你mustdo如下:(見代碼段下面

  1. 聲明一個對話的協議
  2. 指定的家長將遵循該協議
  3. 在創建一個委託財產你的孩子
  4. 當父母即將啓動孩子時,它將自己指定爲該孩子的代理人
  5. 當孩子想要切換時,它會調用父母使用該協議

@protocol myVCDelegate 
    - (void)switchToDifferentController:(int) viewNumber ; 
@end 


@interface ParentViewController : UIViewController <VCDelegate> 

@property(nonatomic, assign) id <VCDelegate> delegate 

childController.delegate = self; 

[self.delegate switchToDifferentController:kController5];