在使用導航控制器進行控制器的返回操作時,是通過pop()方法將當前的控制器移出棧頂控制器,並將上一個進棧的控制器移入棧頂控制器並顯示其視圖。在大多數應用中,通常將這種返回操作設置給導航控制器導航欄中的backBarButtonItem控件來完成,例如iphone中的設置界面(如下圖所示),當完成"General"的設置后,點擊"setting"即可跳轉到上一級控制器。但是在UINavigationItem下還有一個leftBarButtonItem,同樣可以設置控制器的返回,下面就將這兩個控件的使用進行簡單的說明。
在對控制器的返回按鈕(UIBarBUttonItemm是一種特殊的Button)進行設置前,需要弄清楚UINavigationItem和UINavigationBar的區別。UINavigationBar的功能類似於UINavigationController中的棧,UINavigationController管理的是控制器的棧,而UINavigationBar管理的是UIBarButtonItem。在UINavigationController中有一個UINavigationBar類的屬性-navigationBar,查看這個屬性(@property(nonatomic,readonly) UINavigationBar *navigationBar; // The navigation bar managed by the controller. Pushing, popping or setting navigation items on a managed navigation bar is not supported.),雖然在UINavigationBar中有push、pop NavigaitonItem的方法,但我們看到在屬性后又這樣注釋:“這個navigationbar是通過控制器來管理的,它本身不支持pushing,poping或者setting 一個navigationbar”,說明UInavigationItem的pop、push方法是由系統自動管理的,我們僅需知道UINavigationController push或者pop一個控制器的同時,UInavigationBar也在對應的push和pop UINavigationItem,導航欄和控制器是一一對應的同步關系。
那么了解了UINavigationBar的作用后,我們來了解一下UINavigationItem。UINavgationItem管理着顯示在UINavigationBar上的按鈕和圖片,每一個push進棧的控制器都會自帶一個navigationbar,navigationbar要實現顯示圖片和button,就需要通過UINavtionItem完成。為了驗證以上說法,我們也可以查看UINavigationItem的類屬性,UINavigationItem包含了NavigaitonBar視圖的全部元素(如title,tileview,backBarButtonItem等,同時又受當前棧頂控制器管理,即NavigaitonBar形成整個NavigationController的導航視圖,然后每個NavigationController頁面的導航欄元素由所在頁面的UINavigationItem管理。簡單的概括:控制器視圖中的導航欄顯示由UINavigationBar和UiNavigationItem共同完成,在控制器進行跳轉時,UINavigationBar管理導航欄與棧頂控制器的對應關系,而UINavigationItem管理導航欄的顯示內容。
現在我們就可以通過兩種不同的方式來設置導航控制器上的返回按鈕:
首先我們定義兩個控制器對象:
UIViewController *AController =[[UIViewController alloc]init];
UIViewController *Bcontroller = [[UIViewController alloc]init];
在Appdelegate中將AController設置為主控制器,在A控制器中添加一個Button,點擊后按鈕后push到B控制器,設置完成后界面如下:
當不設置返回按鈕的標題時,返回按鈕默認顯示的是上一個控制器的標題。
現在通過第一種方式更改返回按鈕的顯示,即通過設置backBarButtonItem來實現,但是要跳轉到B控制器,需要在A控制器中進行設置,以下為在A控制器中的代碼。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor redColor]; self.navigationItem.title = @"主控制器"; //創建一個button並設置屬性 UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 80, 80)]; btn.center = self.view.center; [btn setTitle:@"跳轉Next" forState:UIControlStateNormal]; [btn setBackgroundColor:[UIColor blueColor]]; [self.view addSubview:btn]; //添加點擊事件 [btn addTarget:self action:@selector(BtnClick) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil]; self.navigationItem.backBarButtonItem = backItem; } -(void)BtnClick{ //創建B控制器 BViewController *Bcontroller = [[BViewController alloc]init]; //設置跳轉 [self.navigationController pushViewController:Bcontroller animated:YES]; }
設置完成后改變了返回按鈕的標題:
通過第二種方式修改返回按鈕,則直接在當前控制器(即B控制器)中進行設置,代碼如下:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor greenColor]; self.navigationItem.title = @"NO.2控制器"; //創建leftItem UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(btnClick)]; //設置給leftBarButtonItem self.navigationItem.leftBarButtonItem = leftItem; } -(void)btnClick{ [self.navigationController popToRootViewControllerAnimated:YES]; }
設置后更改了返回按鈕的樣式,效果如下:
兩種方式都可以實現控制器的正常跳轉,只要理解了UINavigationBar和UINavigationItem的不同作用,在開發中實現相關控制器導航欄的設置將會變得很簡單。如描述有誤請見諒,期待與您一起交流!