一. 導航控制器總述:
UINavigationController是用于構(gòu)建分層應用程序的主要工具,主要采用棧形式來實現(xiàn)視圖。任何類型的視圖控制器都可放入棧中。在設計導航控制器時需要指定根視圖即用戶看到的第一個視圖。根視圖控制器是被導航控制器推入到棧中的第一個視圖控制器。當用戶查看下一個試圖時,棧中將加入一個新的視圖控制器,它所控制的視圖將展示給用戶。我們可以通過導航按鈕來操作分層的應用程序,用它來控制視圖的推入或推出。
二. 構(gòu)建導航應用程序的骨架:
Xcode已經(jīng)提供了導航應用程序的模板。但我們還是從零開始創(chuàng)建一個導航的應用程序以便更好的理解導航是如何構(gòu)成及工作的。當然你也可以直接使用Xcode提供好的模板
1. 創(chuàng)建一個基于Windows-Based Application (注:Xcode 4.2.1是創(chuàng)建一個Empty Application 這個模板創(chuàng)建好之后沒有mainWindow.xib 它在代碼中創(chuàng)建了一個window不知道apple公司為什么要這樣做?難道是鼓勵大家少用xib? 呵呵。不過我們可以手動添加一個mainWindow.xib,添加方法請訪問http://blog.csdn.net/decemberd/article/details/7066763)
2. 創(chuàng)建一個視圖控制器用于顯示根視圖。這里你可以顯示任何你想顯示的內(nèi)容。我們僅以FirstLevelViewController作為例子。(你需要在這個類中填充你想顯示的內(nèi)容)
3. 設置導航控制器
a. 在程序的AppDelegate.h中加入UINavigationController *navController并添加輸出口。
b.在.m文件中申明屬性后在didFinishLaunchingWithOption函數(shù)中將控制器加入windows視圖,代碼如下: [window addSubview:navController.view];
c. 托一個NavigationController控件到mainWindow.xib
d. 按下control鍵從Nav App Delegate圖標拖到新的NavigationController圖標選擇navController輸出口
e. 指定根視圖:選中Navigation Controller目錄下的Root ViewController,按下cmd+4鍵打開身份檢查器將基類改為我們剛才創(chuàng)建的FirstLevelViewController類。如果你的FirstLevelViewController類已經(jīng)填充完畢我們就可以開始運行程序了。
看一下,運行程序是不是我們所期望的那樣???
三. 構(gòu)建導航按鈕:
導航應用程序中經(jīng)常應用導航按鈕來控制視圖的推入推出,這種設計模式可以反復的構(gòu)建復雜的分層應用程序,那么導航按鈕是如何實現(xiàn)的呢?
上圖中的Back按鈕和Next按鈕就是導航按鈕我們可以通過UIBarButtonItem來設置導航按鈕,例如下面的代碼就是我們在導航的工具條上創(chuàng)建了兩個按鈕,一個back按鈕一個next按鈕:
//設置導航按鈕 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonPressd)]; //第一個參數(shù)為按鈕標題 //第二個參數(shù)是按鈕樣式 //第三個參數(shù)接受消息的對象 //第四個參數(shù)是按鈕的回調(diào)函數(shù)
[[self navigationItem] setLeftBarButtonItem:backButton]; //設置為左邊按鈕
//釋放按鈕 [backButton release];
//設置導航按鈕 UIBarButtonItem *rootButton = [[UIBarButtonItem alloc] initWithTitle:@"Root" style:UIBarButtonItemStyleBordered target:self action:@selector(rootButtonPressd)]; //第一個參數(shù)為按鈕標題 //第二個參數(shù)是按鈕樣式 //第三個參數(shù)接受消息的對象 //第四個參數(shù)是按鈕的回調(diào)函數(shù)
[[self navigationItem] setRightBarButtonItem:rootButton]; //設置為右邊按鈕
//釋放按鈕 [rootButton release];
這段代碼應該很容易理解,我們創(chuàng)建了一個導航按鈕,設置了標題,按鈕風格和按鈕的回調(diào)函數(shù),然后setLeftBarButtonItem 是將它設置為左邊按鈕相應的setRightBarButtonItem是設置為右邊按鈕
四. 導航控制器視圖的推入推出:
那么導航控制器是如何推入一個試圖或者如何推出一個試圖的呢? 它是通過navigationController的pushViewController: animated:函數(shù)實現(xiàn)的。看下面這段代碼:
//創(chuàng)建新的試圖并將試圖推入棧中 SecondLevelViewController*secondController = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil]; UINavigationController *theNavController = [[UINavigationController alloc] initWithRootViewController:secondController]; [secondControllerrelease]; theNavController.navigationBar.tintColor =[UIColor blackColor]; [self.navigationController pushViewController:secondController animated:YES]; [theNavController release];
我們創(chuàng)建了一個試圖并把他加入Nav最后通過pushViewController把它放入棧中此時SecondLevelViewController所控制的視圖也會出現(xiàn)在用戶眼中,下面就是我們新彈出的視圖: 那么如何推出視圖呢?相信你一定已經(jīng)猜到了,push相對應的便是pop,popViewControllerAnimated將當前的視圖控制器推出了棧,還有一種是我們在進行了很多視圖之后想直接返回到根試圖,它也一樣很容易實現(xiàn)popToRootViewControllerAnimated就可以幫我們直接到達棧的最底層也就是根視圖,在下圖的Root按鈕中我們直接調(diào)用[self.navigationController popToRootViewControllerAnimated:YES];就可以回到根試圖了 詳細代碼請查閱Nav demo地址:http://download.csdn.net/detail/decemberd/3920630 有關(guān)更多的navigationController的操作請查看官方文檔。謝謝 |
|