UINavigationController的结构
最朴素的说,UINavigationController就是一个容器,设置它的RootViewController,即设定了第一个vc,随后push一个新vc即入栈,pop便出栈,值得注意到是pop可以到任意层的vc。
1.创建一个NavigationController 并设定RootViewController
self.window.rootViewController=[[UINavigationController alloc]initWithRootViewController:[[AViewController alloc]initWithNibName:nil bundle:nil]];
不用对NavigationController进行设定 你要显示的导航栏或者工具栏 均针对每个单独的viewcontroller里面设定
2.navigationItem(navigationBar)
//self.title=@"root"; //self.navigationItem.titleView 用来自定义tittle 可以新建一个view放进去 //navigationItem.title 的优先级高于self.title self.navigationItem.title=@"root"; //设定prompt navigationBar高度会增加30,总的高度会变成74 self.navigationItem.prompt = @"This is prompt"; //设定 BarButtonItem UIBarButtonItem *rightButton=[[UIBarButtonItem alloc]initWithTitle:@"第二页" style:UIBarButtonItemStyleBordered target:self action:@selector(toPop)]; self.navigationItem.rightBarButtonItem=rightButton;
push出新的页面时 navigationBar的规律
- 如果当前viewController设定了leftBarButtonItem 则显示该leftBarButtonItem
- 当前页面没有leftBarButtonItem 显示之前vc的backBarButtonItem 如果也没有 则自动生成一个返回按钮就 用之前的tittle
- ios5之后leftItemsSupplementBackButton 设为yes 允许leftBarButtonItem和backBarButtonItem同时显示
3.toolBar
self.navigationController.toolbarHidden=NO; UIBarButtonItem *one = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:nil action:nil]; UIBarButtonItem *two = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil]; UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; [self setToolbarItems:[NSArray arrayWithObjects:flexItem,one,flexItem,two,flexItem,nil]];
注意一下flexItem
以数组的方式把UIBarButtonItem加入到ToolBar中,当然toolbarHidden=NO才会显示
4.出栈入栈(页面跳转)
入栈(跳一个新页面出来)
[self.navigationController pushViewController:[[AViewController alloc]initWithNibName:Nil bundle:nil] animated:YES];
出栈
//回到上一个视图控制器 [self.navigationController popViewControllerAnimated:YES]; //回到某一个视图控制器 //[self.navigationController popToViewController:viewController animated:YES]; [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex: ([self.navigationController.viewControllers count] -层次)] animated:YES]; //回到根视图控制器 [self.navigationController popToRootViewControllerAnimated:YES];
5.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;
或者就使用
-(void)viewWillAppear:(BOOL)animated { NSLog(@"1111"); } -(void)viewWillDisappear:(BOOL)animated { NSLog(@"222222"); }
6.UINavigationController的viewControllers属性
通过该属性我们可以实现一次性替换整个navigationController的层次, 这个过程如果通过setViewControllers:animated:来设置,并指定动画为YES的画,动画将会从当前的navigationController所显示的vc跳转到所设置的目标viewController的最顶层的那个VC,而中间其他的VC将会被直接从VC层级中移除和添加进来(没有动画)。
self.navigationController setViewControllers:(NSArray *) animated:(BOOL)
7.topViewController 和 visibleViewController
topViewController代表当前navigation栈中最上层的VC,而visibleViewController代表当前可见的VC,它可能是topViewController,也可能是当前topViewController present出来的VC。因此UINavigationController的这两个属性通常情况下是一样,但也有可能不同。