如何在UINavigationController中隐藏“后退”按钮?


158

您知道如何在UINavigationController中隐藏“后退”按钮吗?另外,如何显示回来,但是我想这与隐藏它非常相似...

就像在查看电子邮件时单击“编辑”时,邮件应用程序在iPhone上所做的一样。

Answers:


313

我刚刚找到答案,在控制器中使用以下命令:

[self.navigationItem setHidesBackButton:YES animated:YES];

并还原它:

[self.navigationItem setHidesBackButton:NO animated:YES];

-

[更新]

Swift 3.0:

self.navigationItem.setHidesBackButton(true, animated:true)

18
还要从我的错误中学习:setHidesBackButton:在将navigationItem推入navigationController之前,必须先调用。
codingFriend1

为什么以前呢?如果要按下viewController然后隐藏“后退”按钮以防止用户后退怎么办?
user4951 2013年

1
@codingFriend-我发现如果将setHidesBackButton放到不想在其上显示backbutton的视图的viewDidAppear消息处理程序中,它也会起作用。
2013年

2
最好的事件是viewWillAppear:animated隐藏并viewWillDisappear:animated还原它。
pechar 2014年

最终,Apple的Xcode并没有改变。超过5年后,此答案仍然有效。
App Dev Guy

27

添加此代码

[self.navigationItem setHidesBackButton:YES];

22

除了删除后退按钮(使用已经推荐的方法)之外,不要忘记用户仍然可以在iOS 7及更高版本中使用从左到右的滑动手势来“弹出”上一个屏幕。

要禁用它(在适当的情况下),请实现以下功能(例如,在viewDidLoad中):

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
     self.navigationController.interactivePopGestureRecognizer.enabled = NO;

1
马特-为您+1。感谢您添加此注释。很有用。对于任何想知道弹出手势如何工作的人,只需在导航栏上从左向右滑动即可重新创建Matt在这里描述的内容。添加上面的代码可以防止用户在包含它的视图控制器上执行此操作。
noobzilla

18

只是为了澄清现有答案:该hidesBackButton属性是正确的答案,但是在很多答案中并不清楚self所指的是什么。基本上,您应该self.navigationItem.hidesBackButton = YES在即将被推入(或刚刚被推入)的视图控制器中进行设置UINavigationController

换句话说,说我有一个UINavigationController名字myNavController。我想在上面放一个新视图,当我这样做时,我不想再显示后退按钮。我可以做类似的事情:

UIViewController *newVC = [[UIViewController alloc] init];
//presumably would do some stuff here to set up the new view controller
newVC.navigationItem.hidesBackButton = YES;
[myNavController pushViewController:newVC animated:YES];

代码完成后,newVC现在应显示由控制的视图,并且不应显示任何后退按钮。


正是我刚开始做NavigationController.NavigationItem时需要的。谢谢马特。
Chucky

16

为了有条件地隐藏和显示“后退”按钮,可以使用以下代码:

-(void)viewDidAppear:(BOOL)animated
{
    if ([tempAry count]==0)
    {
        [self.navigationItem setHidesBackButton:YES animated:YES];
    }
    else
    {
        [self.navigationItem setHidesBackButton:NO animated:YES];
    }
    [super viewDidAppear:animated];
} 

注意:在某些情况下,您必须将其放在viewDidAppear方法中,而不是viewWillAppear中,例如:当将下一类的数组更新为上一类,然后如上所述检查条件进入下一类时。


11

Swift iOS(我使用过以下)

// hide back button
        self.navigationItem.setHidesBackButton(true, animated: false)

// pgrm mark ----- ------

    // hide the back button for this view controller

    override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        self.navigationItem.setHidesBackButton(editing, animated: animated)

    }// end setEditing

10

sethidesbackbutton由于某种原因对我不起作用

我用这种方式->

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 30)]] ;

谢谢..我有同样的问题,其中setHidesBackButton:YES没有工作。但这种解决方案为iOS的7
mohsinj


6

就我而言,我对当前答案的看法很少:

  • 在viewDidLoad / viewWillAppear内部,仅“后退”图标被隐藏,字符串“ Back”处于非活动状态,但仍可见
  • 在viewDidAppear内部,后退按钮消失了...但是我根本不希望用户看到它

因此,最终对我有用的解决方案是:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        [self.navigationItem setHidesBackButton:YES animated:NO];
    }

    return self;
}

3

Zoran Simic提出的解决方案由于某种原因对我不起作用。

这段代码确实起作用了:

MyController* controller   =   [[MyController alloc]  init];
NSArray* array             =   [[[NSArray alloc] initWithObjects:controller, nil] autorelease];

[self.navigationController setViewControllers:array animated:NO];

[controller release];

显然,您必须根据自己的喜好操纵NSArray才能使其正常工作。希望能帮助到别人:)


谢谢你!我在打怪怪的虫子,这成功了。并非适合所有人,但在正确的情况下很有用。
Brandon 2014年

1

在我的UIViewController子类中,我有以下方法:

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

    // hide back button in edit mode
    [self.navigationItem setHidesBackButton:editing animated:YES];
}

0

这会隐藏后退按钮,并在Swift中将其替换为添加按钮:

override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    // This hides the back button while in editing mode, which makes room for an add item button
    self.navigationItem.setHidesBackButton(editing, animated: animated)

    if editing {
        // This adds the add item button
        let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
        // Use the animated setter for the left button so that add button fades in while the back button fades out
        self.navigationItem.setLeftBarButton(addButton, animated: animated)
        self.enableBackGesture(enabled: false)
    } else {
        // This removes the add item button
        self.navigationItem.setLeftBarButton(nil, animated: animated)
        self.enableBackGesture(enabled: true)
    }
}

func enableBackGesture(enabled: Bool) {
    // In addition to removing the back button and adding the add item button while in edit mode, the user can still exit to the previous screen with a left-to-right swipe gesture in iOS 7 and later. This code disables this action while in edit mode.
    if let navigationController = self.navigationController {
        if let interactivePopGestureRecognizer = navigationController.interactivePopGestureRecognizer {
            interactivePopGestureRecognizer.isEnabled = enabled
        }
    }
}

0

雨燕3。

通常,您应该使用此页面上已多次描述的Apple的per-ViewController API,但有时您需要立即控制“后退”按钮。

以下代码隐藏“后退”按钮,并确保在隐藏的按钮区域中不会发生轻击碰撞检测。

let emptyView = UIView(frame: .zero)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: emptyView)

0

这隐藏了后退按钮

let backBtn = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: navigationController, action: nil)


navigationItem.leftBarButtonItem = backBtn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.