关于在TabbarController的viewcontrollers的NavigationBar上设置rightBarButtonItem的问题

今天做项目,碰见了一个问题,在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];
}

以上的相关代码都已交代,均没有出错。

关于在TabbarController的viewcontrollers的NavigationBar上设置rightBarButtonItem的问题_第1张图片
TabBar的一级页面.png
关于在TabbarController的viewcontrollers的NavigationBar上设置rightBarButtonItem的问题_第2张图片
TabBar的二级页面.png

两个页面是同样的代码,我试着打印出两个页面的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的viewcontrollers的NavigationBar上设置rightBarButtonItem的问题_第3张图片
最终显示.png

所以,给我自己的体会是,如果有TabbarController的情况下,其子控制器来作为navigationController的rootViewController,避免出现问题,养成好习惯。

你可能感兴趣的:(关于在TabbarController的viewcontrollers的NavigationBar上设置rightBarButtonItem的问题)