今天做项目,碰见了一个问题,在tabbar的viewcontrollers中的一个页面上加入rightBarButtonItem,结果怎么也不显示,同样的代码换在其它的VC上试时,就除了同样身为tabbar的viewcontrollers的VC不显示以外其余都正常,所以我认为是tabbar和navigationbar的问题,但是以前我也碰见过同样的需求,也正常完成,所以我认真的研究了这一部分的代码。
AppDelegate中关于程序入口是这样写的:
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[TJMainViewController new]];//TJMainViewController是一个TabbarController
在TJMainViewController添加viewControllers的代码
//初始化根视图控制器
- (void)initRootViewController{
UIViewController *tjVC =[TYKYHomeViewController new];
tjVC.title = @"首页";
UIViewController *person = [TJOnlineWorkHome tjPersonWork];
person.title = @"个人";
UIViewController *enterprise =[TJOnlineWorkHome tjEnterpriseWork];
enterprise.title = @"企业";
self.viewControllers = @[tjVC,person,enterprise];
for (UIViewController *vc in self.viewControllers) {
vc.tabBarItem.image = [[UIImage imageNamed:@"unselected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
vc.tabBarItem.selectedImage = [[UIImage imageNamed:@"selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
}
我要在个人和企业中添加一个rightBarButtonItem,我的代码如下:
- (void)makeRightNavigationItem{
UIButton *right = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
if (Screen_width>320) {
right.frame = CGRectMake(0, 0, 25, 25);
}
[right setImage:[UIImage imageNamed:@"tj_help"] forState:UIControlStateNormal];
[right addTarget:self action:@selector(showOrHiddenMoreBtnView:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:right];
}
以上的相关代码都已交代,均没有出错。
两个页面是同样的代码,我试着打印出两个页面的navigationItem和navigationController都是存在的,并且tabbar上的三个页面的navigationItem都是不一样(这很重要,不一样的话说明可以在各自的VC中进行修改),但是添加的rightBarButtonItem还是不显示。
其实问题就在于这一句:
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[TJMainViewController new]];//TJMainViewController是一个TabbarController
把navigationController的rootVC 设置为TabbarController,则之后的在tabbar上的viewControllers虽然有各自的navigationItem,但是却无法操作(这样解释不知道正不正确,如果有误希望可以指出),这样一来,解决的思路就很清晰了。
首先,window的rootView是tabbarController,但是此tabbarController不是navigationController的rootView,而是将三个页面:首页、个人、企业都各自拥有一个navigationController,问题解决。
修改的地方:
1、AppDelegate中关于程序入口
self.window.rootViewController = [TJMainViewController new];
2、 在TJMainViewController添加viewControllers的代码
UIViewController *tjVC =[[UINavigationController alloc] initWithRootViewController: [TYKYHomeViewController new]];
tjVC.title = @"首页";
UIViewController *person = [[UINavigationController alloc] initWithRootViewController: [TJOnlineWorkHome tjPersonWork]];
person.title = @"个人";
UIViewController *enterprise = [[UINavigationController alloc] initWithRootViewController: [TJOnlineWorkHome tjEnterpriseWork]];
enterprise.title = @"企业";
所以,给我自己的体会是,如果有TabbarController的情况下,其子控制器来作为navigationController的rootViewController,避免出现问题,养成好习惯。