iPhone開發之利用ModalViewController切換View

來源:互聯網
上載者:User

iPhone開發之利用ModalViewController切換View是本文要介紹的內容,當程式中含有多個 view,需要在之間切換的時候,可以使用 UINavigationController,或者是 ModalViewController。UINabigationController 是通過嚮導條來切換多個 view

而如果 view 的數量比較少,且顯示領域為全屏的時候,用 ModalViewController 就比較合適比如需要使用者輸入資訊的view,結束後自動回複到之前的view)。今天我們就看看 ModalViewController 的建立方法。

ModalViewController 並不像 UINavigationController 是一個專門的類,使用 UIViewController 的 presentModalViewController 方法指定之後就是 ModalViewController 了。

這裡使用上兩回做成的 CustomViewController由UIViewController繼承)來實現 ModalViewController 的執行個體。

首先,準備 ModalViewController 退出時的函數。調用 UIViewController 的 dismissModalViewController:Animated: 方法就可以了,如下所示:

 
  1.  // 這裡按鈕按下的時候退出 ModalViewController  
  2. -(void)dismiss:(id)inSender {  
  3.     //  如果是被 presentModalViewController 以外的執行個體調用,parentViewController 將是nil,下面的調用無效  
  4.     [self.parentViewController dismissModalViewControllerAnimated:YES];  
  5. }  

接下來,產生另一個 CustomViewController 的執行個體,用來表示 ModalViewController,並將其對應的 view 設定成紅色。然後傳遞給 presentModalViewController: Animated: 顯示 ModalViewController 的 view。

 
  1.  - (void)applicationDidFinishLaunching:(UIApplication *)application {  
  2.     controller = [[CustomViewController alloc] init];  
  3.     [window addSubview:controller.view];  
  4.     [window makeKeyAndVisible];  
  5.     // 產生 ModalViewController  
  6.     CustomViewController* controllerB = [[CustomViewController alloc] init];  
  7.     // 設定 view 的背景為紅色  
  8.     controllerB.view.backgroundColor = [UIColor redColor];  
  9.     // 顯示 ModalViewController view  
  10.     [controller presentModalViewController:controllerB animated:YES];  
  11.     // presentModalViewController 已經被 controller 管理,這裡可以釋放該執行個體了  
  12.     [controllerB release];  
  13. }  

編譯執行以後,首先啟動的是紅色背景的 ModalViewController view、按下按鈕後恢複到藍色背景的通常 view 上。

也可以在顯示 ModalViewController view 之前設定 UIViewContrller 的 modalTransitionStyle 屬性,使其以動畫形式顯示。

 
  1. controllerB.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  

以上的實現只是單一地實現了 ModalViewController view 的功能,除了程式開始提醒使用者一些資訊外什麼也做不了。另外由於是放入了 applicationDidFinishLaunching 中的原因,也不能反覆的顯示。另外,在 ModalViewController view 上設定的內容也不能反映到原來的 view 上。

接下來我們將實現這些功能。

首先,從 ModalViewController view 退出的時候,需要通知原先的 view。這裡使用 iPhone/Cocoa 應用程式中經常使用的Delegate 設計模式也是推薦使用的)。

實際上,系統所提供的映像選擇控制類 UIImagePickerController

或者是參照地址簿時的ABPeoplePickerNavigationController 類,都用到了 Delegate 模式。基於上一講的中的例子,這裡我們追加為3個按鈕,分別是綠色,灰色和取消。

 
  1. - (void)viewDidLoad {  
  2.    [super viewDidLoad];  
  3.    self.view.backgroundColor = [UIColor blueColor];  
  4.    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  5.    button.frame = CGRectMake(100,100,100,100);  
  6.    button.tag = 1;  
  7.    [button setTitle:@"綠色" forState:UIControlStateNormal];  
  8.    //  按鈕事件對應函數  
  9.    [button addTarget:self action:@selector(dismiss:)  
  10.        forControlEvents:UIControlEventTouchUpInside];  
  11.    [self.view addSubview:button];  
  12.  
  13.    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  14.    button.frame = CGRectMake(100,200,100,100);  
  15.    button.tag = 2;  
  16.    [button setTitle:@"灰色" forState:UIControlStateNormal];  
  17.    //  按鈕事件對應函數  
  18.    [button addTarget:self action:@selector(dismiss:)  
  19.        forControlEvents:UIControlEventTouchUpInside];  
  20.    [self.view addSubview:button];  
  21.  
  22.    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  23.    button.frame = CGRectMake(100,300,100,100);  
  24.    button.tag = 0;  
  25.    [button setTitle:@"取消" forState:UIControlStateNormal];  
  26.    //  按鈕事件對應函數  
  27.    [button addTarget:self action:@selector(dismiss:)  
  28.        forControlEvents:UIControlEventTouchUpInside];  
  29.    [self.view addSubview:button];  
  30.   

程式啟動的時候依然是先顯示 ModalViewController view,按下任何一個按鈕,將關閉該view。按下“綠色”按鈕,設定背景為綠色,按下“灰色”按鈕時,設定背景為灰色。“取消”的時候什麼也不做。

委託處理用下面的函數實現,當參數 inColor 為 nil 的時候代表取消。

 
  1. -(void)selectColor:(UIColor*)inColor;  

委託代理的執行個體用 id 變數表示。

 
  1.  @interface CustomViewController : UIViewController {  
  2.     id  colorSelectDelegate;  
  3. }  

設定該變數的函數如下。

 
  1.  -(void)setColorSelectDelegate:(id)inDelegate {  
  2.     colorSelectDelegate = inDelegate;  
  3. }  

另外如上面 viewDidLoad 所示,按鈕的 tag 分別為0、1、2。按鈕按下時調用的函數中由不同的 tag 來發送不同的 UIColor執行個體到 colorSelectDelegate 上。

 
  1.  -(void)dismiss:(id)inSender {  
  2.     UIView* view = (UIView*)inSender;  
  3.     UIColor* requestColor = nil;  
  4.     if (view.tag == 1)  
  5.         requestColor = [UIColor greenColor];  
  6.     if (view.tag == 2)  
  7.         requestColor = [UIColor grayColor];  
  8.     [colorSelectDelegate selectColor:requestColor];  
  9. }  

這是不使用 UIButton* 而是用 UIView* ,是因為 tag 屬性被定義在 UIView 類中,不需要必須轉換為 UIButton 類。

另外這樣一來,該函數在 UIButton 以外的情況下也能被使用。

如果想檢查 id 是什麼類性的可以使用 isKindOfClass: 方法。接收到具體的參數 inColor 更換背景色,並關閉 ModalViewController view。

 
  1.  -(void)selectColor:(UIColor*)inColor {  
  2.     if (inColor != nil)  
  3.         self.view.backgroundColor = inColor;  
  4.     [self dismissModalViewControllerAnimated:YES];  
  5. }  

另外,在調用 presentModalViewController 之前顯示 ModalViewController view 之前),需要設定委託的執行個體。

 
  1. - (void)applicationDidFinishLaunching:(UIApplication *)application {  
  2.    controller = [[CustomViewController alloc] init];  
  3.    [window addSubview:controller.view];  
  4.    [window makeKeyAndVisible];  
  5.    //  建立 ModalViewController view 的 Controller  
  6.    CustomViewController* controllerB = [[CustomViewController alloc] init];  
  7.    //  設定背景色為紅色  
  8.    controllerB.view.backgroundColor = [UIColor redColor];  
  9.    //  設定委託執行個體  
  10.    [controllerB setColorSelectDelegate:controller];  
  11.    //  顯示 ModalViewController view  
  12.    [controller presentModalViewController:controllerB animated:YES];  
  13.    [controllerB release];  
  14.   

編譯一下,程式啟動後顯示紅色背景的 ModalViewController view,點擊綠色按鈕後,原先的view的背景變為綠色,點擊灰色,顯示灰色的背景,而點擊取消,那麼將顯示原先藍色的背景。

這樣的形式,就是將按鈕的動作委託給原先view的 Controller 來處理了。根據送來的 UIColor 來設定不同的背景色。

小結:iPhone開發之利用ModalViewController切換View的內容介紹完了,希望本文對你有所協助!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.