標籤:
(1)導航控制器初始化的時候一般都有一個根視圖控制器,導航控制器相當於一個棧,裡面裝的是視圖控制器,最先進去的在最下面,最後進去的在最上面。在最上面的那個視圖控制器的視圖就是這個導航控制器對外展示的介面,也就是使用者看到的介面。
(2)我們需要把導航控制器載入到APP中,需要把這個導航控制器設定為window的根視圖控制器(都是控制器類,可以賦值),這樣就相當於載入到了window裡。
(3)我們要在棧中新增或者刪除一個視圖控制器,就需要得到導航控制器,一般在棧中得所有視圖控制器都有一個self.navigationController,意思是我的導航控制器,也就是這個視圖控制器所在的導航控制器,這樣就拿到了導航控制器。
(4)棧中新增視圖控制器用pushViewController,其實就是push進去一個,這樣對於使用者而言就是開啟一個新介面了。
(5)棧中刪除一個視圖控制器用popViewControllerAnimated,當然這個pop只能pop最上面的那個,對於使用者而言相當於從當前視圖回到上一級視圖。
(6)其實這個push和pop對於使用者而言都是開啟和跳轉頁面的一個操作。而pop由更多地操作方法,如一下子pop掉只剩下一個根視圖控制器,那麼就相當於從好幾層直接回到最原始的首頁面。也可以指定pop幾個,以跳轉到指定的頁面。
(7)最重要的應該就是這個push和pop方法,而pop有很多種,這個理解後就不難記憶。
(a)AppDelegate.m中,增加下面代碼:
view sourceprint?
01.
#
import
"AppDelegate.h"
02.
//因為要執行個體化一個對象,需要這個類,所以匯入
03.
#
import
"ViewController.h"
04.
05.
@interface
AppDelegate ()
06.
07.
@end
08.
09.
@implementation
AppDelegate
10.
11.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
12.
//建立一個視圖控制器,以屆時作為導航控制器的根視圖控制器
13.
ViewController *root1=[[ViewController alloc]init];
14.
//初始化導航控制器的時候把上面建立的root1初始化給它
15.
UINavigationController *nav1=[[UINavigationController alloc]initWithRootViewController:root1];
16.
//最後,我們把window的根視圖控制器設為導航控制器,這樣導航控制器就能夠顯示在螢幕上
17.
self.window.rootViewController=nav1;
18.
// Override point for customization after application launch.
19.
return
YES;
20.
}
21.
22.
@end
(b)在ViewController.m增加以下代碼:
view sourceprint?
01.
#
import
"ViewController.h"
02.
//因為需要執行個體化一個對象,所以匯入它
03.
#
import
"SecondViewController.h"
04.
05.
@interface
ViewController ()
06.
07.
@end
08.
09.
@implementation
ViewController
10.
11.
- (
void
)viewDidLoad {
12.
//建立一個按鈕,點擊後進入子視圖控制器,相當於進入子頁面
13.
UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
14.
btn1.frame=CGRectMake(
38
,
100
,
300
,
30
);
15.
[btn1 setTitle:@
"jump to secondviewcontroller"
forState:UIControlStateNormal];
16.
btn1.backgroundColor=[UIColor whiteColor];
17.
self.view.backgroundColor=[UIColor redColor];
18.
[btn1 addTarget:self action:
@selector
(jumpTo) forControlEvents:UIControlEventTouchUpInside];
19.
[self.view addSubview:btn1];
20.
[
super
viewDidLoad];
21.
// Do any additional setup after loading the view, typically from a nib.
22.
}
23.
24.
-(
void
)jumpTo{
25.
//這裡面核心的有兩個,所謂跳轉,其實就是往導航控制器棧中PUSH或者POP一個視圖控制器,這樣在最上面的視圖控制器就變了,這樣視圖也跟著變了,因為只顯示在棧頂得那個視圖控制器的視圖
26.
//所以(1)控制所謂的跳轉,其實是導航控制器在控制,在裡面的元素都可以通過navigationController屬性擷取到它們所在的導航控制器
27.
//所以(2)擷取到導航控制器之後,使用Push的那個方法,往棧裡面放一個視圖控制器senCon1,這個新放入的在棧頂,就顯示它的視圖,所以使用者改變頁面跳轉了
28.
SecondViewController *senCon1=[[SecondViewController alloc]init];
29.
[self.navigationController pushViewController:senCon1 animated:YES];
30.
}
31.
32.
@end
(c)在SecondViewController.m中增加以下代碼:
view sourceprint?
01.
#
import
"SecondViewController.h"
02.
03.
@interface
SecondViewController ()
04.
05.
@end
06.
07.
@implementation
SecondViewController
08.
09.
- (
void
)viewDidLoad {
10.
UILabel *label1=[[UILabel alloc]init];
11.
label1.frame=CGRectMake(
38
,
80
,
300
,
30
);
12.
label1.backgroundColor=[UIColor whiteColor];
13.
[email protected]
"This is secondviewcontroller"
;
14.
[self.view addSubview:label1];
15.
16.
UIButton *btn2=[UIButton buttonWithType:UIButtonTypeRoundedRect];
17.
btn2.frame=CGRectMake(
38
,
120
,
300
,
30
);
18.
[btn2 setTitle:@
"backTo"
forState:UIControlStateNormal];
19.
btn2.backgroundColor=[UIColor orangeColor];
20.
[self.view addSubview:btn2];
21.
[btn2 addTarget:self action:
@selector
(backTo) forControlEvents:UIControlEventTouchUpInside];
22.
[
super
viewDidLoad];
23.
// Do any additional setup after loading the view.
24.
}
25.
//可以手動設定pop出棧,相當於刪除這個頁面,跳轉到其他頁面
26.
//popViewControllerAnimated就是彈出,因為彈出只能彈出最上面的棧頂的那個,所以可以不用指定參數
27.
//popToRootViewControllerAnimated-就是直接跳轉到根視圖控製圖,如果只有兩層,那麼和popViewControllerAnimated並無區別,如果有很多層,那麼其實就是相當於不僅把自己pop出去,還把所有除了根視圖控製圖之外的所有視圖控制器都pop出去了,所以就相當於跳轉到根視圖控制器了
28.
//popToViewController-就是跳轉到指定的視圖控制器xxx,這個xxx一定要在這個棧裡面,即一定是在我們當前這個視圖控制器的下面的,所以跳轉也就是把自己和在xxx上面的所有視圖控制器都pop出去,然後相當於直接跳轉到xxx
29.
//此處重點是這個xxx怎麼擷取,按照一般理解是用xxx再初始化一個視圖控制器對象yyy,然後把這個對象yyy作為popToViewController參數
30.
//但事實是,yyy是新初始化的,不在棧中,當然和在棧中的xxx初始化的那個對象也不是同一個對象,所以會報錯(因為在棧中找不到啊)
31.
//所以,self.navigationController.viewControllers出場,viewControllers是個數組,儲存的時導航控制器棧中所有的視圖控制器,最先push進去的時0,以此類推,最上面的肯定是數組的最後一個
32.
//所以,那個xxx之前初始化的對象,可以用[self.navigationController.viewControllers objectAtIndex:0]表示,此處0就是根視圖控制器
33.
//所以,只要拿到navigationController,貌似能做很多事情
34.
-(
void
)backTo{
35.
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:
0
] animated:YES];
36.
}
37.
38.
@end
截個圖:
iOS開發-21UINavigationController導航控制器初始化 導航控制器棧的push和pop跳轉理解