iPhone開發之利用ModalViewController切換View
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的內容介紹完了,希望本文對你有所幫助!