http://code4app.com/course/28-2972-3395
http://www.cnblogs.com/smileEvday/archive/2012/05/14/2495153.html
基本概念
导航视图控制器是用于构建分层应用程序的主要工具,管理着多个内容视图的压入和弹出。自身提供了视图切换的动画效果。
父类是UIViewController,所有视图控制器的积累。导航控制器是以栈的形式来实现。
基本样式
三部分,顶部为导航栏(NavigationBar),中间为内容区域,底部导航控制器的工具栏(UIToolBar),默认是隐藏的。
常用的属性和方法
//获取到栈中最顶层的视图控制器
@property(nonatomic, readonly,retain)UIViewController *topViewController;
//获取到栈中当前显示的视图控制器
@property(nonatomic, readonly,retain) UIViewController *visibleViewController;
//在栈中当前视图控制器
@property(nonatomic, copy) NSArray *viewControllers;
//隐藏导航栏,默认是不隐藏
@property(nonatomic, getter=isNavigationbarHidden) Bool naviationBarHidden;
//获取导航bar
@property(nonatomic, readonly) UINavigationBar * navigationBar;
//初始化一个跟视图控制器,在栈的最低层
-(id) initWithRootViewController: (UIViewController *) rootViewController;
//压入栈中一个新视图控制器
-(void) pushViewController: (UIViewController *)viewController animated: (BOOL) animated;
//弹出一个视图控制器
-(UIViewController *)popViewControllerAnimated: (BOOL)animated;
//弹出到指定的视图控制器,类似index方法,直接定位到栈中某一个controller
-(NSArray *) popToViewController :(UIViewController *) viewController animated:(BOOL) animated;
//回到根视图控制器
-(NSArray *) popToRootViewControllerAnimated:(BOOL) animated;
UIViewController有一个属性是navigationController,如果当前ViewController在某个NavigationController的堆栈中的话(即是被推送过来的),则视图控制器的这个属性就指向那个NavigationController,否则为nil。
每当出栈一个或者多个视图控制器(poptoviewController和popToRootViewControllerAnimated)的时候,系统就将对出栈的Viewcontroller做内存清理,所以ViewController中的强引用要在其dealloc中做清理。
视图放置顺序基本就是 window ——NavigationController——XXViewController(具体的controller)
NavigationItem
一个导航控制器控制着若干个视图控制器(XViewController)。
一个导航控制器包含一个NavigationBar和一个toolBar;
每个视图控制器(XViewController)都有一个NavigationItem的属性。具体一点儿来说就是每一个加到navigationController的viewController都会有一个对应的navigationItem,该对象由viewController以懒加载的方式创建,稍后我们可以在对象中对navigationItem进行配置,可以设置leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title以及prompt等属性。前三个每一个都是一个UIBarButtonItem对象,最后两个属性是一个NSString类型描述
一定不能用导航控制器中的NavigationItem属性,那样是无效的。
// set rightItem
UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithTitle:@"Root" style:UIBarButtonItemStyleBordered target:self action:@selector(popToRootVC)];
childOne.navigationItem.rightBarButtonItem = rightItem;
[rightItem release];
// when you design a prompt for navigationbar, the hiehgt of navigationbar will becaome 74, ignore the orientation
childOne.navigationItem.prompt = @"Hello, im the prompt";
UINavigationControllerDelegate ,通过设置代理监听视图控制器的切换。
这个代理真的很简单,就是当一个viewController要显示的时候通知一下外面,给你一个机会进行设置,包含如下两个函数:
// Called when the navigation controller shows a new top view controller via a push, pop or setting of the view controller stack.
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
当你需要对某些将要显示的viewController进行修改的话,可实现该代理。
Toolbar
和NavigationBar类似的,在NavigationViewController中仅包含一个,同时,一个toolbar也可以包含若干个UIBarButtonItem。不同是默认是隐藏的。看例子:
// test ToolBar
UIBarButtonItem *one = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
UIBarButtonItem *two = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBookmarks target:nil action:nil];
UIBarButtonItem *three = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];
UIBarButtonItem *four = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:nil action:nil];
UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[childOne setToolbarItems:[NSArray arrayWithObjects:flexItem, one, flexItem, two, flexItem, three, flexItem, four, flexItem, nil]];
[one release];
[two release];
[three release];
[four release];
[flexItem release];
childOne.navigationController.toolbarHidden = NO;
topViewController 和visibleViewController
topViewController代表当前navigation栈中最上层的VC,而visibleViewController代表当前可见的VC,它可能是topViewController,也可能是当前topViewController present出来的VC。因此UINavigationController的这两个属性通常情况下是一样,但也有可能不同。