uinavigationbar和uinavigatileftbarbuttonitemm的区别和联系

iOS UINavigationController与UITabBarController的组合使用 - 路漫漫其修远兮 吾将上下而求索 - ITeye博客
博客分类:
1.导航类型
UINavigationController 适用于父子页面的跳转
UITabBarController 适用于平级页面的跳转
2.presentViewController / dismissViewControllerAnimated和pushViewController / popViewController
(1)只有从UINavigationController导航过来的UIViewController 才可以使用pushViewController / popViewController,从其它导航进入的只能使用presentViewController / dismissViewControllerAnimated
(2)如果A界面是通过presentViewController进入的,那么在A界面里只能使用presentViewController导航,如果A界面是通过UINavigationController包装了一层进入,则可使用pushViewController导航。
(3)如果A界面是一个UITabBarController,进入时是通过presentViewController来导航的,那么子Tab里也只能通过presentViewController来导航,如果进入时是通过UINavigationController包装了一层进入,则可使用[self.tabBarController.navigationController pushViewController:abcdViewController animated:true];这种方式导航。
3.修改UINavigationController导航进入后导航栏的图标及文字
UIBarButtonItem* leftBar = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(homeBack)];
self.navigationItem.leftBarButtonItem = leftB
//可添加多个导航按钮
self.navigationItem.leftBarButtonItems =
//同样右边的导航按钮也可以设置
4.创建UITabBarController时需注意,要先创建出来,然后通过UINavigationController包装后才能显示,否则tab子项不显示。创建格式如下
TabOneViewController* oneVC = [[TabOneViewController alloc]init];
oneVC.view.backgroundColor = [UIColor whiteColor];
UITabBarItem* item1 = [[UITabBarItem alloc]initWithTitle:@"tab1" image:nil tag:0];
oneVC.tabBarItem = item1;
TabTwoViewController* twoVC = [[TabTwoViewController alloc]init];
UITabBarItem* item2 = [[UITabBarItem alloc]initWithTitle:@"tab2" image:nil tag:1];
twoVC.tabBarItem = item2;
HomeViewController* homeVC = [[HomeViewController alloc]init];
NSArray* array = [[NSArray alloc]initWithObjects:oneVC,twoVC, nil];
homeVC.viewControllers =
UINavigationController* navVC = [[UINavigationController alloc]initWithRootViewController:homeVC];
[self presentViewController:navVC animated:YES completion:^{}];
//下面这种创建了HomeViewController后,HomeViewController下的子Tab不能通过push或者pop导航
HomeViewController* homeVC = [[HomeViewController alloc]init];
[self presentViewController:homeVC animated:YES completion:^{}];
5.UITabBarController各页面之间的切换
实现UITabBarControllerDelegate协议
//实现协议方法,用于切换Tab时,更改页面的标题
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
NSInteger index = tabBarController.selectedI
NSString *
switch (index) {
title = @"Message";
title = @"User List";
self.title
参考文章:/articles/J7nIVbN
浏览 31058
浏览: 173297 次
来自: 北京
我用的你的代码,第一次导入数据还挺正常,但以后都报内存的错误j ...
对我有帮助 总结就是有好处啊
http://www. ...
非常不错,谢谢在使用导航控制器进行控制器的返回操作时,是通过pop()方法将当前的控制器移出栈顶控制器,并将上一个进栈的控制器移入栈顶控制器并显示其视图。在大多数应用中,通常将这种返回操作设置给导航控制器导航栏中的backBarButtonItem控件来完成,例如iphone中的设置界面(如下图所示),当完成"General"的设置后,点击"setting"即可跳转到上一级控制器。但是在UINavigationItem下还有一个leftBarButtonItem,同样可以设置控制器的返回,下面就将这两个控件的使用进行简单的说明。
在对控制器的返回按钮(UIBarBUttonItemm是一种特殊的Button)进行设置前,需要弄清楚UINavigationItem和UINavigationBar的区别。UINavigationBar的功能类似于UINavigationController中的栈,UINavigationController管理的是控制器的栈,而UINavigationBar管理的是UIBarButtonItem。在UINavigationController中有一个UINavigationBar类的属性-navigationBar,查看这个属性(@property(nonatomic,readonly) UINavigationBar *navigationB // The navigation bar managed by the controller. Pushing, popping or setting navigation items on a managed navigation bar is not supported.),虽然在UINavigationBar中有push、pop NavigaitonItem的方法,但我们看到在属性后又这样注释:&这个navigationbar是通过控制器来管理的,它本身不支持pushing,poping或者setting 一个navigationbar&,说明UInavigationItem的pop、push方法是由系统自动管理的,我们仅需知道UINavigationController push或者pop一个控制器的同时,UInavigationBar也在对应的push和pop UINavigationItem,导航栏和控制器是一一对应的同步关系。
那么了解了UINavigationBar的作用后,我们来了解一下UINavigationItem。UINavgationItem管理着显示在UINavigationBar上的按钮和图片,每一个push进栈的控制器都会自带一个navigationbar,navigationbar要实现显示图片和button,就需要通过UINavtionItem完成。为了验证以上说法,我们也可以查看UINavigationItem的类属性,UINavigationItem包含了NavigaitonBar视图的全部元素(如title,tileview,backBarButtonItem等,同时又受当前栈顶控制器管理,即NavigaitonBar形成整个NavigationController的导航视图,然后每个NavigationController页面的导航栏元素由所在页面的UINavigationItem管理。简单的概括:控制器视图中的导航栏显示由UINavigationBar和UiNavigationItem共同完成,在控制器进行跳转时,UINavigationBar管理导航栏与栈顶控制器的对应关系,而UINavigationItem管理导航栏的显示内容。
现在我们就可以通过两种不同的方式来设置导航控制器上的返回按钮:
首先我们定义两个控制器对象:
UIViewController *AController =[[UIViewController alloc]init];
UIViewController *Bcontroller = [[UIViewController alloc]init];
在Appdelegate中将AController设置为主控制器,在A控制器中添加一个Button,点击后按钮后push到B控制器,设置完成后界面如下:
当不设置返回按钮的标题时,返回按钮默认显示的是上一个控制器的标题。
现在通过第一种方式更改返回按钮的显示,即通过设置backBarButtonItem来实现,但是要跳转到B控制器,需要在A控制器中进行设置,以下为在A控制器中的代码。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor redColor];
self.navigationItem.title = @"主控制器";
//创建一个button并设置属性
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 80, 80)];
btn.center = self.view.
[btn setTitle:@"跳转Next" forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:btn];
//添加点击事件
[btn addTarget:self action:@selector(BtnClick) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil];
self.navigationItem.backBarButtonItem = backI
-(void)BtnClick{
//创建B控制器
BViewController *Bcontroller = [[BViewController alloc]init];
//设置跳转
[self.navigationController pushViewController:Bcontroller animated:YES];
设置完成后改变了返回按钮的标题:
通过第二种方式修改返回按钮,则直接在当前控制器(即B控制器)中进行设置,代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor greenColor];
self.navigationItem.title = @"NO.2控制器";
//创建leftItem
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:@selector(btnClick)];
//设置给leftBarButtonItem
self.navigationItem.leftBarButtonItem = leftI
-(void)btnClick{
[self.navigationController popToRootViewControllerAnimated:YES];
设置后更改了返回按钮的样式,效果如下:
&两种方式都可以实现控制器的正常跳转,只要理解了UINavigationBar和UINavigationItem的不同作用,在开发中实现相关控制器导航栏的设置将会变得很简单。如描述有误请见谅,期待与您一起交流!
阅读(...) 评论()上传时间:
千锋旗下扣丁学堂为大家提供最新最全面的iOS、Android开发教学视频,我们的教学视频在持续更新中,想要观看更多更全面的视频,访问我们的官网,在这里有你意想不到的惊喜.
56官方微信
扫一扫发现精彩ios7 自定义UINavigationBar UIBarButtonItem 10px的偏移纠正的两种解决方案
方案一:利用UINavigationBar 自带的布局item(Fixed space Bar Button Item)来适配ios7. 其实就是在原来返回按钮的位置上在多加一个占位的Item
为UINavigationBar 写一个分类。UINavigationItem+correct_offset.h
@interface UINavigationItem (correct_offset)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonI
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonI
#import UINavigationItem+correct_offset.h
#define ios7 ([[[UIDevice currentDevice] systemVersion] floatValue]&=7.0?YES:NO)
@implementation UINavigationItem (correct_offset)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
if (ios7) {
// Add a spacer on when running lower than iOS 7.0
UIBarButtonItem *negativeSpacer = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
target:nil action:nil];
negativeSpacer.width = -20;
[self setLeftBarButtonItems:[NSArrayarrayWithObjects:negativeSpacer, leftBarButtonItem,nil]];
// Just set the UIBarButtonItem as you would normally
[self setLeftBarButtonItem:leftBarButtonItem];
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
if (ios7) {
// Add a spacer on when running lower than iOS 7.0
UIBarButtonItem *negativeSpacer = [[UIBarButtonItemalloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
target:nilaction:nil];
negativeSpacer.width = 10;
[self setRightBarButtonItems:[NSArrayarrayWithObjects:negativeSpacer, rightBarButtonItem,nil]];
// Just set the UIBarButtonItem as you would normally
[self setRightBarButtonItem:rightBarButtonItem];
在要设置返回按钮的UIViewController中按照如下使用。
[self.navigationItemaddLeftBarButtonItem:[self creatBarItemWithAction:@selector(dismiss)]];
creatBarItemWithAction是我自己写的一个方法。
* 退出视图。
-(void)dismiss
[selfdismissViewControllerAnimated:YEScompletion:nil];
* 创建一个UIBarButtonItem
* @param _action action
* @return UIBarButtonItem
-(UIBarButtonItem*)creatBarItemWithAction:(SEL)_action{
UIButton* button = [UIButtonbuttonWithType:UIButtonTypeCustom];
[button setImage:[UIImageimageNamed:@backButton.png]forState:UIControlStateNormal];
[button setFrame:CGRectMake(0,0,40, 40)];
[button addTarget:selfaction:_action forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem* item = [[UIBarButtonItemalloc] initWithCustomView:button] ;
方式二:在创建自定义UIBarButtonItem的时候通过设置自定义view的图片偏移属性来做适配。
在要设置返回按钮的UIViewController中按照如下使用。
self.navigationItem.leftBarButtonItem = [selfcreatBarItemWithAction:@selector(dismiss)solutiontwo:2];
-(UIBarButtonItem*)creatBarItemWithAction:(SEL)_action solutiontwo:(NSInteger)index{
UIButton* button = [UIButtonbuttonWithType:UIButtonTypeCustom];
[button setImage:[UIImageimageNamed:@backButton.png]forState:UIControlStateNormal];
[button setFrame:CGRectMake(0,0,40, 40)];
if (ios7) {
[button setImageEdgeInsets:UIEdgeInsetsMake(0, -30,0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0,0, 0,0)];
[button addTarget:selfaction:_action forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem* item = [[UIBarButtonItemalloc] initWithCustomView:button] ;

我要回帖

更多关于 rightbarbuttonitem 的文章

 

随机推荐