UINavigationController

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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/EnamelPot/p/3465681.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值