简体   繁体   中英

Hide BarButton item from Navigation Controller of TabBarController

I have a tabBarController that contains three tabs. I want to show rightBarButtonItem to navigation bar only in 1st ViewController but when i am getting back i want it to be visible again. How to achieve this?

I tried to set enabled=NO for the BarButtonItem but the result wasn't good.

I also tried to set BarButtonItem to nil when the view changes but when i get back has disappeared.

I moved BarButtonItem from viewDidLoad to viewWillAppear but it did't work properly.

This is the code for rightBarButtonItem into viewDidLoad of first ViewController.

UIImage *refreshButtonImage = [UIImage imageNamed:@"9B_Info.png"];
UIImage *refreshButtonImageB = [UIImage imageNamed:@"9A_Info.png"];

UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom];

[refreshButton setImage:refreshButtonImage
               forState:UIControlStateNormal];

[refreshButton setImage:refreshButtonImageB
               forState:UIControlStateHighlighted];

[refreshButton setImage:refreshButtonImageB
               forState:UIControlStateSelected];

refreshButton.frame = CGRectMake(0, 0, 30, 30);

[refreshButton addTarget:self
                  action:@selector(showImageInfo)
        forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *refreshBarButtonItem = [[UIBarButtonItem alloc]  initWithCustomView:refreshButton];

self.refreshBtn=refreshBarButtonItem;

[self.tabBarController.navigationItem setRightBarButtonItem:self.refreshBtn];

Do you use storyboard or all in programmatic way ? Try this:

1- open new project ( single view )

2- go into storyboard -> add a navigation controller 在此处输入图片说明

3- delete the table view controller 在此处输入图片说明

4- set your navigation controller as the start controller ( drag the arrow which points your view controller to your navigation controller ) 在此处输入图片说明

5- set your view controller as the root view controller of your navigation controller 在此处输入图片说明在此处输入图片说明在此处输入图片说明

6- complete with your codes and @Apurv's solution bellow

Replace your below line:

[self.tabBarController.navigationItem setRightBarButtonItem:self.refreshBtn];

With this line:

[self.navigationItem setRightBarButtonItem:self.refreshBtn];

When you want to display it for viewController only, do not add it to tabBarController.

If anyone comes up with this in future this worked for me:

In first view controller i added this to viewWillAppear

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];

    NSLog(@"!!!!");

    UIImage *refreshButtonImage = [UIImage imageNamed:@"9B_Info.png"];
    UIImage *refreshButtonImageB = [UIImage imageNamed:@"9A_Info.png"];

    UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom];

    [refreshButton setImage:refreshButtonImage
                forState:UIControlStateNormal];

    [refreshButton setImage:refreshButtonImageB
                forState:UIControlStateHighlighted];

    [refreshButton setImage:refreshButtonImageB
                forState:UIControlStateSelected];

    refreshButton.frame = CGRectMake(0, 0, 30, 30);

    [refreshButton addTarget:self
                   action:@selector(showImageInfo)
         forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *refreshBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:refreshButton];

    self.refreshBtn=refreshBarButtonItem;

    [self.tabBarController.navigationItem setRightBarButtonItem:self.refreshBtn];



}

And in second View Controller in viewWillAppear method this:

    self.tabBarController.navigationItem.rightBarButtonItem=nil;

The problem is that viewDidLoad of each viewController into TabBarController is called only once but viewWillAppear every time that viewController comes up.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM