EnamelPot

自律在于今天和明天之间

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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的规律

  1. 如果当前viewController设定了leftBarButtonItem 则显示该leftBarButtonItem
  2. 当前页面没有leftBarButtonItem 显示之前vc的backBarButtonItem 如果也没有 则自动生成一个返回按钮就 用之前的tittle
  3. 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的这两个属性通常情况下是一样,但也有可能不同。

posted on 2013-12-09 16:44  EnamelPot  阅读(377)  评论(0)    收藏  举报