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: 方法就可以了,如下所示:
- // 這裡按鈕按下的時候退出 ModalViewController
- -(void)dismiss:(id)inSender {
- // 如果是被 presentModalViewController 以外的執行個體調用,parentViewController 將是nil,下面的調用無效
- [self.parentViewController dismissModalViewControllerAnimated:YES];
- }
接下來,產生另一個 CustomViewController 的執行個體,用來表示 ModalViewController,並將其對應的 view 設定成紅色。然後傳遞給 presentModalViewController: Animated: 顯示 ModalViewController 的 view。
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- controller = [[CustomViewController alloc] init];
- [window addSubview:controller.view];
- [window makeKeyAndVisible];
- // 產生 ModalViewController
- CustomViewController* controllerB = [[CustomViewController alloc] init];
- // 設定 view 的背景為紅色
- controllerB.view.backgroundColor = [UIColor redColor];
- // 顯示 ModalViewController view
- [controller presentModalViewController:controllerB animated:YES];
- // presentModalViewController 已經被 controller 管理,這裡可以釋放該執行個體了
- [controllerB release];
- }
編譯執行以後,首先啟動的是紅色背景的 ModalViewController view、按下按鈕後恢複到藍色背景的通常 view 上。
也可以在顯示 ModalViewController view 之前設定 UIViewContrller 的 modalTransitionStyle 屬性,使其以動畫形式顯示。
- controllerB.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
以上的實現只是單一地實現了 ModalViewController view 的功能,除了程式開始提醒使用者一些資訊外什麼也做不了。另外由於是放入了 applicationDidFinishLaunching 中的原因,也不能反覆的顯示。另外,在 ModalViewController view 上設定的內容也不能反映到原來的 view 上。
接下來我們將實現這些功能。
首先,從 ModalViewController view 退出的時候,需要通知原先的 view。這裡使用 iPhone/Cocoa 應用程式中經常使用的Delegate 設計模式也是推薦使用的)。
實際上,系統所提供的映像選擇控制類 UIImagePickerController
或者是參照地址簿時的ABPeoplePickerNavigationController 類,都用到了 Delegate 模式。基於上一講的中的例子,這裡我們追加為3個按鈕,分別是綠色,灰色和取消。
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.view.backgroundColor = [UIColor blueColor];
- UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- button.frame = CGRectMake(100,100,100,100);
- button.tag = 1;
- [button setTitle:@"綠色" forState:UIControlStateNormal];
- // 按鈕事件對應函數
- [button addTarget:self action:@selector(dismiss:)
- forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:button];
-
- button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- button.frame = CGRectMake(100,200,100,100);
- button.tag = 2;
- [button setTitle:@"灰色" forState:UIControlStateNormal];
- // 按鈕事件對應函數
- [button addTarget:self action:@selector(dismiss:)
- forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:button];
-
- button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- button.frame = CGRectMake(100,300,100,100);
- button.tag = 0;
- [button setTitle:@"取消" forState:UIControlStateNormal];
- // 按鈕事件對應函數
- [button addTarget:self action:@selector(dismiss:)
- forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:button];
-
程式啟動的時候依然是先顯示 ModalViewController view,按下任何一個按鈕,將關閉該view。按下“綠色”按鈕,設定背景為綠色,按下“灰色”按鈕時,設定背景為灰色。“取消”的時候什麼也不做。
委託處理用下面的函數實現,當參數 inColor 為 nil 的時候代表取消。
- -(void)selectColor:(UIColor*)inColor;
委託代理的執行個體用 id 變數表示。
- @interface CustomViewController : UIViewController {
- id colorSelectDelegate;
- }
設定該變數的函數如下。
- -(void)setColorSelectDelegate:(id)inDelegate {
- colorSelectDelegate = inDelegate;
- }
另外如上面 viewDidLoad 所示,按鈕的 tag 分別為0、1、2。按鈕按下時調用的函數中由不同的 tag 來發送不同的 UIColor執行個體到 colorSelectDelegate 上。
- -(void)dismiss:(id)inSender {
- UIView* view = (UIView*)inSender;
- UIColor* requestColor = nil;
- if (view.tag == 1)
- requestColor = [UIColor greenColor];
- if (view.tag == 2)
- requestColor = [UIColor grayColor];
- [colorSelectDelegate selectColor:requestColor];
- }
這是不使用 UIButton* 而是用 UIView* ,是因為 tag 屬性被定義在 UIView 類中,不需要必須轉換為 UIButton 類。
另外這樣一來,該函數在 UIButton 以外的情況下也能被使用。
如果想檢查 id 是什麼類性的可以使用 isKindOfClass: 方法。接收到具體的參數 inColor 更換背景色,並關閉 ModalViewController view。
- -(void)selectColor:(UIColor*)inColor {
- if (inColor != nil)
- self.view.backgroundColor = inColor;
- [self dismissModalViewControllerAnimated:YES];
- }
另外,在調用 presentModalViewController 之前顯示 ModalViewController view 之前),需要設定委託的執行個體。
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- controller = [[CustomViewController alloc] init];
- [window addSubview:controller.view];
- [window makeKeyAndVisible];
- // 建立 ModalViewController view 的 Controller
- CustomViewController* controllerB = [[CustomViewController alloc] init];
- // 設定背景色為紅色
- controllerB.view.backgroundColor = [UIColor redColor];
- // 設定委託執行個體
- [controllerB setColorSelectDelegate:controller];
- // 顯示 ModalViewController view
- [controller presentModalViewController:controllerB animated:YES];
- [controllerB release];
-
編譯一下,程式啟動後顯示紅色背景的 ModalViewController view,點擊綠色按鈕後,原先的view的背景變為綠色,點擊灰色,顯示灰色的背景,而點擊取消,那麼將顯示原先藍色的背景。
這樣的形式,就是將按鈕的動作委託給原先view的 Controller 來處理了。根據送來的 UIColor 來設定不同的背景色。
小結:iPhone開發之利用ModalViewController切換View的內容介紹完了,希望本文對你有所協助!