Navigation(導覽) Controller是一個可用來導覽內容的方式。以下有兩種方式可以將這個控制器建立到應用程式中,一種是使用initWithNibName的方式,另一種則是利用Interface Builder協助載入view的方式。兩種方式事實上都是很常見,但有許多程式設計師,會認為第一種會比較有操控感,少用Interface Builder可以讓除錯容易,也更容易從程式碼來理解寫了什麼東西。以下的第一種方式,去除了重載initWithNibName的作法,為了和第二種方式來對應。這裡只是展示了,用兩種方式都可以達到同一個目的,在許多的開發教學中,也會常常見到不同的作法。另外,有一種方式是直接使用在新增Project時,就直接選擇Navigation-based Application,到底幫你作了什麼事?下面第二種方式有說明。
一、利用initWithNibName來載入view的方式:
AppDelegate.h
←加入宣告UINavigationController *navigationController;
(並不需要用ib來加nav)
AppDelegate.m
←在applicationDidFinishLaunching區域中加入以下的步驟:
1、加入第一個view controller的header file
#import "FirstViewController.h"
#import "FirstViewController.h"
2、alloc init這個nav controller
navigationController = [[UINavigationController alloc] init];
3、加入這個nav controller到window的subview中(用addSubview)
[window addSubview:navigationController.view];
4、用第一個view的controller建立一個新的view controller,並用 initWithNibName初始化
FirstViewController *viewController = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil];
5、用nav controller的pushViewController將第一個view顯現(不需要動畫所以animated設為NO)
[navigationController pushViewController:viewController animated:NO];
6、release剛push完的view controller
[viewController release];
7、在dealloc方法中加入nav controller的release宣告
[navigationController release];
FirstViewControler.h
←加入一個- (IBAction)push:(id)sender;
FirstViewController.m
1、加入第二個view controller的header file
#import "SecondViewController.h"
2、實作push按鈕的action
//2-1初始化
SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil];
//2-2用pushViewController加入,動畫也設為YES
[self.navigationController pushViewController:secondViewController animated:YES];
//2-3把這個加入過的view controller給release
[secondViewController release];
3、在viewDidLoad方法中設title(nav controller用的)
self.title = @"First";
SecondViewController.h
SecondViewController.m
1、在viewDidLoad方法中設title(nav controller用的)
self.title = @"Second";
二、利用Interface Builder輔助載入view的方式
(註:在建立一個新的project,選擇Navigation-based Application是直接完成以下的1~5步驟)
(和上述的方式不同處是不需要管第一個要載入的root view,只要設定好nav controller和app delegate的關係,以及設定好是root view是那一個view controller就會自動載入了)
1、建立新project選擇Windows-based Application。AppDelegate.h中加入一個新的IBOutlet UINavigationController。
UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
2、在Classes新增一個新的檔案,選擇Cocoa Touch Classes→UIViewController Subclass,並勾選Option With XIB for user interface,假設名稱為FirstViewController,完成後把.xib檔移至Resource資料夾中
3、雙點擊MainWindow.xib打開Interface Builder,從Library中拉一個Navigation Controller到主視窗中(有File's Owner那個),點選Navigation Controller,然後點出Connection Inspector將設定如下圖。(按住ctrl從Connection Inspector直接拉往主視窗中的xxx App Delegate然後放開)
![nav01](http://blog.joomla.org.tw/images/stories/119_nav01.png)
4、點選Navigation Controller下的Root View Controller,點出Attributes和Identity Inspector設定如下圖。
5、AppDelegate.m加入以下程式碼
@synthesize navigationController;
,並在applicationDidFinishLaunching方法中加入
[window addSubview:navigationController.view];
dealloc方法中加入nav controller的release宣告
[navigationController release];
此時第一個view會正確先載入
6、依照2的說明再加一個新的view controller,名稱為SecondViewController
7、再點擊MainWindow.xib打開Interface Builder,加入一個view controller在最下方,依照第4點的方法選用SecondViewController
8、FirstViewControler.h
←加入一個- (IBAction)push:(id)sender;
9、FirstViewController.m
加入第二個view controller的header file
#import "SecondViewController.h"
實作push按鈕的action
//初始化
SecondViewController *secondViewController = [[SecondViewController alloc] init];
//用pushViewController加入,動畫也設為YES
[self.navigationController pushViewController:secondViewController animated:YES];
//把這個加入過的view controller給release
[secondViewController release];
在viewDidLoad方法中設title(nav controller用的)
self.title = @"First";
SecondViewController.h
SecondViewController.m
在viewDidLoad方法中設title(nav controller用的)
self.title = @"Second";