iOS 模態檢視,檢視之間的切換
一、檢視之間的簡單切換。
檢視之間的切換實質是檢視控制器之間的切換,因為試圖控制器(UIViewController)上面都有檢視(view),試圖控制器切換了,檢視自然就實現了切換。
新建一個工程,建立兩個類FirstViewController和SecondViewController,它們的父類都是UIViewController,還有工程裡自帶的ViewController,一共三個檢視控制器。
在每個類裡面,即在這裡的每個試圖控制器裡都寫一個如下所示touch方法,這個方法是點選螢幕就能呼叫,以便我們除錯程式。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ }
再來設定一下每個檢視的背景顏色,就可以了,也是為了方便除錯。
1、如果要實現ViewController到FirstViewController切換,首先在ViewController中引入FirstViewController的標頭檔案。
ViewController.m裡面程式碼:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.bacgroundColor=[UIColor whiteColor];//設定成白色
}
//點選螢幕呼叫此方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
FirstViewController * firstVC=[[FirsttViewController alloc]init];
[self presentViewController:firstVC animated:YES completion:^{
NSLog(@"present成功,從ViewController切換到FirstViewController");//此方法呼叫了會執行這行程式碼
}];
}
這樣就可以了,但是這樣的話從FirstViewController就回不到ViewController了,所以要在FirstViewController.m裡寫如下方法了。在FirstViewController裡面引入ViewController標頭檔案。
- (void)viewDidLoad {
[super viewDidLoad];
self.view.bacgroundColor=[UIColor redColor];//設定成紅色
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"dismiss成功,從FirstViewController返回到ViewController");
}];
}
這就實現了從ViewController到FirstViewController得來回轉換了。
總結:要實現檢視之間的切換,要在兩個檢視控制器中分別寫如下兩個方法。
presentViewController: animated: completion:
dismissViewControllerAnimated: completion:
這兩個方法一般是一起使用,才能實現兩個檢視之間的來回切換。我們暫且說成一個present方法,一個dismiss方法。
2、模態檢視
檢視控制器有一個presentModalViewController:的方法,該方法可以實現檢視切換,從當前檢視跳轉到下一個檢視,通過此方法彈出的檢視我們都稱為模態檢視,模態檢視是手機上非常常見。此方法如下:
[self presentModelViewController: animated: completion:^{}];
模態檢視出現的場景一般是臨時彈出的視窗,譬如:登陸視窗。
模態檢視彈出時通過modalTransitionStyle屬性設定不同的動畫效果 。
呼叫dismissModalViewControllerAnimated: 方法關閉視窗。
示例程式碼和上述大致一樣,只是模態檢視彈出時通過modalTransitionStyle屬性設定不同的動畫效果。將上述呼叫的方法稍作修改就可以了。
ViewController.m中
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
FirstViewController *firstVC = [[FirstViewController alloc] init];
firstVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;//設定檢視彈出時的動畫效果
[self presentModalViewController:firstVC animated:YES];
}
然後在FirstViewController.m中呼叫
[self dismissModelViewControllerAnimated: completion:^{ }];
3、以上兩種情況都是實現了試圖控制器之間的直接切換,中間沒有什麼其他東西。下面我們說如果存在導航欄控制器(UINavigationController)的情況下如何實現檢視切換。
可以在story.board裡拽一個UINavigationController,把它的根檢視設定成ViewController,將story.board裡is initial View Controller勾選√,讓程式的入口從導航欄控制器進入。
其他的和1裡一樣。只是呼叫的方法有所改變,有導航欄控制器的情況下,呼叫的方法是:
ViewController.m中
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
FirstViewController *firstVC = [[FirstViewController alloc] init];
[self.navigationController pushViewController:firstVC animated:YES];
}
這樣就行了,即使在FirstViewController.m中不寫方法,程式執行也會自帶有一個按鈕返回ViewController。如圖:
點選Back就自動返回到上一級了。
但是也可以寫一個返回方法,系統是這個方法,寫不寫的區別在下面補充裡面,個人覺得還是挺重要的關於這一點。
[self.navigationController pop...];建議自己嘗試一下。所以這裡所用的方法總結下就是一個push,一個pop。
補充:
首先說一下UINavigationController有一個屬性就是viewControllers,它是一個數組,儲存導航欄控制器的所有檢視控制器,也就是一個navigationController所有的viewController都在viewControllers裡面。
在沒有push到FirstViewController裡面的時候,FirstViewController並不是navigationController的子控制器,當push到FirstViewController後,navigationController就新添加了一個子控制器FirstViewController。viewControllers裡也就有了FirstViewController。如果不用pop方法pop回去的話,FirstViewController的navigationController就存在了,但使用了pop方法pop回去的話就又釋放掉了,navigationControllerd的viewControllers也就沒有FirstViewController了。
注意:push和pop方法都是navigationController的方法,呼叫時候,一般用[self.navigationController ...];
這就解釋了為什麼一個導航欄控制器只有一個根控制器,其他的控制器是怎麼新增上,怎麼去除的了。
最後,為什麼沒用到SenconedViewController呢?留著自己再做做實驗吧。
初學iOS,如果有錯,還望不吝賜教。