导航控制器
UINavigationController是用于构建分层应用程序的主要工具
UINavigationController是作为栈来实现的,这让它非常适合用于处理分层数据
导航控制器维护一个视图控制器栈,任何类型的视图控制器都可以放入栈中。在设计导航控制器时,你需要指定用户看到的第一个视图,该视图是视图层次结构中最低层的视图,器控制器称为根视图控制器(root view controller),根视图控制器是被导航控制器推入到栈中的第一个视图控制器。当用户选择查看一个视图时,栈中将加入一个新的视图控制器,它所控制视图将展示给用户。我们把这些新的视图控制器称为子控制器(subcontroller)
1、新建Single View Application 名字Nav
2、新建UIViewController subclass 名字:RootViewController
3、修改delegate
@class NavViewController;
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
IBOutlet UINavigationController *navController;
}
@property (retain, nonatomic) IBOutlet UIWindow *window;
@property (retain, nonatomic) UINavigationController *navController;
@end
@implementation AppDelegate
@synthesize window = _window;
@synthesize navController;
-(void) applicationDidFinishLaunching:(UIApplication *)application
{
[_window addSubview:navController.view];
[_window makeKeyAndVisible];
}
- (void)dealloc
{
[navController release];
[_window release];
[super dealloc];
}
4、打开MainWindow.xib,拖一个Navigation Controller到dock上,
选中View Controller,将其class改为RootViewController
5、新建SecondLevelViewController
6、修改RootViewController
#import "RootViewController.h"
#import "SecondLevelViewController.h"
#import "AppDelegate.h"
@implementation RootViewController
@synthesize controllers;
- (void)viewDidUnload
{
self.title = @"Root Level";
NSMutableArray *array = [[NSMutableArray alloc] init];
self.controllers = array;
[array release];
[super viewDidUnload];
}
- (void)dealloc {
[controllers release];
[super dealloc];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.controllers count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *RootViewControllerCell = @"RootViewControllerCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RootViewControllerCell];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:RootViewControllerCell] autorelease];
}
NSUInteger row = [indexPath row];
SecondLevelViewController *controller = [controllers objectAtIndex:row];
cell.text = controller.title;
cell.image = controller.rowImage;
return cell;
}
-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
NSUInteger row = [indexPath row];
SecondLevelViewController *nextController = [self.controllers objectAtIndex:row];
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.navController pushViewController:nextController animated:YES];
}
实现第一个子控制器
1、新建UIViewController subclass 命名为DisclosureButtonController
2、新建DisClosureDetailController
@interface DisclosureDetailController : UIViewController
{
IBOutlet UILabel *label;
NSString *message;
}
@property (nonatomic,retain) UILabel *label;
@property (nonatomic,retain) NSString *message;
@end
@implementation DisclosureDetailController
@synthesize label;
@synthesize message;
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
//..
}
return self;
}
-(void) viewWillAppear:(BOOL)animated
{
label.text = message;
[super viewWillAppear:animated];
}
- (void)dealloc {
[label release];
[message release];
[super dealloc];
}
@end
3、修改DisclosureButtonController
#import <UIKit/UIKit.h>
#import "SecondLevelViewController.h"
@class DisclosureButtonController;
@interface DisclosureButtonController : SecondLevelViewController <UITabBarDelegate,UITableViewDataSource>
{
NSArray *list;
DisclosureButtonController *childController;
}
@property (nonatomic,retain) NSArray *list;
@end
#import "DisclosureButtonController.h"
#import "NavAppDelegate.h"
#import "DisclosureDetailController.h"
@implementation DisclosureButtonController
@synthesize list;
-(id) initWithStyle:(UITableViewStyle)style
{
if (self = [super initWithStyle:style]) {
//..
}
return self;
}
- (void)dealloc {
[list release];
[childController release];
[super dealloc];
}
-(void) viewDidLoad{
NSArray *array = [[NSArray alloc] initWithObjects:@"Toy Story",
@"A Bug's Life",@"Toy Story 2",@"Monsters, Inc.",@"Finding Nemo",@"The Incredibles",@"Cars",@"Rataouille",@"WALL-E", @"Up",nil ];
self.list = array;
[array release];
[super viewDidLoad];
}
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [list count];
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *DisclosureButtonCellIdentifier = @"DisclosureButtonCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DisclosureButtonCellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:DisclosureButtonCellIdentifier] autorelease];
}
NSUInteger row = [indexPath row];
NSString *rowString = [list objectAtIndex:row];
cell.text = rowString;
[rowString release];
return cell;
}
- (UITableViewCellAccessoryType) tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellAccessoryDetailDisclosureButton;
}
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Do you see the disclosure button" message:@"touch" delegate:nil cancelButtonTitle:@"Don't" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
- (void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
if (childController == nil) {
childController = [[DisclosureDetailController alloc] initWithNibName:@"DisclosureDetailController" bundle:nil];
}
childController.title = @"Title";
NSUInteger row = [indexPath row];
NSString *selectedMovie = [list objectAtIndex:row];
NSString *detailMessage = [[NSString alloc ] initWithFormat:@"you",selectedMovie];
//childController.message = detailMessage;
childController.title = selectedMovie;
[detailMessage release];
NavAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.navController pushViewController:childController animated:YES];
}