iOS 8: UINavigationController hide back button

2020-06-07 08:51发布

问题:

After I run my application in iOS 8 (XCode 6.0.1, iPhone 6), the back button does not hide.

My code:

- (void)removeCategoriesButton
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [_navigationController.topViewController.navigationItem setHidesBackButton:YES];
        [_navigationController.topViewController.navigationItem setLeftBarButtonItem:nil];
    } else {
        UIViewController *controller = _app.window.rootViewController;

        if ([controller isKindOfClass:[UINavigationController class]]) {
            UINavigationController *nav = (UINavigationController *)controller;
            [nav.topViewController.navigationItem setHidesBackButton:YES];
            [nav.topViewController.navigationItem setLeftBarButtonItem:nil];
        }
    }
}

But the back button does not hide (see screenshot):

UPD:

I run application in another simulators, and i see this "bug" only on iOS 8.

回答1:

This worked for me.

-(void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [self.navigationItem setHidesBackButton:YES];
    [self.navigationItem setTitle:@"Home"];
}


回答2:

I tried many of the answers but the only one that worked for me was:

    override func viewDidLoad() {
    super.viewDidLoad()

    let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
    navigationItem.leftBarButtonItem = backButton
}


回答3:

Call on your ViewDidLoad the following method:

Objective-C:

self.navigationItem.leftBarButtonItem = nil;

or

self.navigationItem.hidesBackButton = YES;

Swift:

navigationItem.hidesBackButton = true


回答4:

Swift:

self.navigationItem.hidesBackButton = true


回答5:

I found that this was caused by pushing a new view in viewWillAppear, if I moved it to viewDidAppear then the back button didn't show. Strange that this issue only appeared in iOS8.



回答6:

Try this:

[self.navigationItem setHidesBackButton:YES];

for (UIView *view in self.navigationController.navigationBar.subviews)
{
    NSString *name = [NSString stringWithFormat:@"%@",view.class];
    if ([name isEqualToString:@"UINavigationItemButtonView"] || [name isEqualToString:@"_UINavigationBarBackIndicatorView"]) {
        [view setHidden:YES];
    }
}


回答7:

Where have you written that code?

It should be as simple as in your view controller's loadView/viewDidLoad: method adding this

[self.navigationItem setHidesBackButton:YES];

This works for me on an iPhone 6



回答8:

Try to use self.navigationItem.hidesBackButton = true in viewWillAppear() method, this worked for me.



回答9:

Hiding the back button using setHidesBackButton only works if you have not customized the button.

From the method reference: "Specify true if the back button should be hidden when this navigation item is the top item. Specify false if the back button should be visible, assuming it has not been replaced by a custom item." (Note the last line)

The simply solution in that case is to first set the leftBarButtonItem to nil.

Swift 3.0:

self.navigationItem.leftBarButtonItem = nil
self.navigationItem.setHidesBackButton(true, animated: false)


回答10:

This bug only happens when you use Storyboard. Another solution is add an UIBarButtonItem with empty title to "fake" it.



回答11:

The only way I've found to do this is to hide the navigation bar and adding a navigation bar in storyboard and redisplay the navigation bar in the next ViewController. All I had to do is add a label in the status bar so that the navigation bar is uniform. I have found no other way...

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    [[self navigationController] setNavigationBarHidden:YES animated:YES];
}

so that the navigation bar is displayed in the next viewcontroller, declare in:

- (void)viewWillDisappear:(BOOL)animated
{
    [[self navigationController] setNavigationBarHidden:NO animated:YES];

}