push 和pop的區別

(1)導航控制器初始化的時候通常都有一個根視圖控制器,導航控制器至關於一個棧,裏面裝的是視圖控制器,最早進去的在最下面,最後進去的在最上面。在最上面的那個視圖控制器的視圖就是這個導航控制器對外展現的界面,也就是用戶看到的界面。html

(2)咱們須要把導航控制器加載到APP中,須要把這個導航控制器設置爲window的根視圖控制器(都是控制器類,能夠賦值),這樣就至關於加載到了window裏。數組

(3)咱們要在棧中新增或者刪除一個視圖控制器,就須要獲得導航控制器,通常在棧中得全部視圖控制器都有一個self.navigationController,意思是個人導航控制器,也就是這個視圖控制器所在的導航控制器,這樣就拿到了導航控制器。app

(4)棧中新增視圖控制器用pushViewController,其實就是push進去一個,這樣對於用戶而言就是打開一個新界面了。ide

(5)棧中刪除一個視圖控制器用popViewControllerAnimated,固然這個pop只能pop最上面的那個,對於用戶而言至關於從當前視圖回到上一級視圖。.net

(6)其實這個push和pop對於用戶而言都是打開和跳轉頁面的一個操做。而pop由更多地操做方法,如一會兒pop掉只剩下一個根視圖控制器,那麼就至關於從好幾層直接回到最原始的主頁面。也能夠指定pop幾個,以跳轉到指定的頁面。code

(7)最重要的應該就是這個push和pop方法,而pop有不少種,這個理解後就不難記憶。orm

(a)AppDelegate.m中,增長下面代碼:htm

#import "AppDelegate.h"
//由於要實例化一個對象,須要這個類,因此導入
#import "ViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //建立一個視圖控制器,以屆時做爲導航控制器的根視圖控制器
    ViewController *root1=[[ViewController alloc]init];
    //初始化導航控制器的時候把上面建立的root1初始化給它
    UINavigationController *nav1=[[UINavigationController alloc]initWithRootViewController:root1];
    //最後,咱們把window的根視圖控制器設爲導航控制器,這樣導航控制器就可以顯示在屏幕上
    self.window.rootViewController=nav1;
    // Override point for customization after application launch.
    return YES;
}

@end

viewController.m對象

#import "ViewController.h"
//由於須要實例化一個對象,因此導入它
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    //建立一個按鈕,點擊後進入子視圖控制器,至關於進入子頁面
    UIButton *btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn1.frame=CGRectMake(38, 100, 300, 30);
    [btn1 setTitle:@"jump to secondviewcontroller" forState:UIControlStateNormal];
    btn1.backgroundColor=[UIColor whiteColor];
    self.view.backgroundColor=[UIColor redColor];
    [btn1 addTarget:self action:@selector(jumpTo) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn1];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

-(void)jumpTo{
    //這裏面核心的有兩個,所謂跳轉,其實就是往導航控制器棧中PUSH或者POP一個視圖控制器,這樣在最上面的視圖控制器就變了,這樣視圖也跟着變了,由於只顯示在棧頂得那個視圖控制器的視圖
    //因此(1)控制所謂的跳轉,實際上是導航控制器在控制,在裏面的元素均可以經過navigationController屬性獲取到它們所在的導航控制器
    //因此(2)獲取到導航控制器以後,使用Push的那個方法,往棧裏面放一個視圖控制器senCon1,這個新放入的在棧頂,就顯示它的視圖,因此用戶改變頁面跳轉了
    SecondViewController *senCon1=[[SecondViewController alloc]init];
    [self.navigationController pushViewController:senCon1 animated:YES];
}

@end

在SecondViewController.m中增長如下代碼:get

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    UILabel *label1=[[UILabel alloc]init];
    label1.frame=CGRectMake(38, 80, 300, 30);
    label1.backgroundColor=[UIColor whiteColor];
    label1.text=@"This is secondviewcontroller";
    [self.view addSubview:label1];
    
    UIButton *btn2=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn2.frame=CGRectMake(38, 120, 300, 30);
    [btn2 setTitle:@"backTo" forState:UIControlStateNormal];
    btn2.backgroundColor=[UIColor orangeColor];
    [self.view addSubview:btn2];
    [btn2 addTarget:self action:@selector(backTo) forControlEvents:UIControlEventTouchUpInside];
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
//能夠手動設置pop出棧,至關於刪除這個頁面,跳轉到其餘頁面
//popViewControllerAnimated就是彈出,由於彈出只能彈出最上面的棧頂的那個,因此能夠不用指定參數
//popToRootViewControllerAnimated-就是直接跳轉到根視圖控制圖,若是隻有兩層,那麼和popViewControllerAnimated並沒有區別,若是有不少層,那麼其實就是至關於不只把本身pop出去,還把全部除了根視圖控制圖以外的全部視圖控制器都pop出去了,因此就至關於跳轉到根視圖控制器了
//popToViewController-就是跳轉到指定的視圖控制器xxx,這個xxx必定要在這個棧裏面,即必定是在咱們當前這個視圖控制器的下面的,因此跳轉也就是把本身和在xxx上面的全部視圖控制器都pop出去,而後至關於直接跳轉到xxx
//此處重點是這個xxx怎麼獲取,按照通常理解是用xxx再初始化一個視圖控制器對象yyy,而後把這個對象yyy做爲popToViewController參數
//但事實是,yyy是新初始化的,不在棧中,固然和在棧中的xxx初始化的那個對象也不是同一個對象,因此會報錯(由於在棧中找不到啊)
//因此,self.navigationController.viewControllers出場,viewControllers是個數組,儲存的時導航控制器棧中全部的視圖控制器,最早push進去的時0,以此類推,最上面的確定是數組的最後一個
//因此,那個xxx以前初始化的對象,能夠用[self.navigationController.viewControllers objectAtIndex:0]表示,此處0就是根視圖控制器
//因此,只要拿到navigationController,貌似能作不少事情
-(void)backTo{
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
}

@end

 

轉自http://www.it165.net/pro/html/201409/23004.html

相關文章
相關標籤/搜索