如何隐藏UINavigationController中的“返回”按钮?

165

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

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

14个回答

329

我刚刚找到了答案,在控制器中使用以下代码:

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

并恢复它:

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

--

[更新]

Swift 3.0:

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

20
还有,从我的错误中学习:在将navigationItem推入导航控制器之前,您必须调用setHidesBackButton:。请注意先后顺序。 - codingFriend1
为什么要在前面?如果您想推送一个视图控制器,然后隐藏返回按钮以防止用户返回,该怎么办? - user4951
1
@codingFriend - 我发现如果你将setHidesBackButton放在你不想显示返回按钮的视图的viewDidAppear消息处理程序中,它也能起作用。 - Anon
2
最佳的事件是 viewWillAppear:animated 来隐藏它,viewWillDisappear:animated 来恢复它。 - Lukas
最终有些东西是苹果在Xcode中没有改变的。5年多过去了,这个答案仍然非常好用。 - App Dev Guy
@pechar,如果返回(弹出导航栈),甚至不需要恢复它。 - HotJard

27

添加这段代码

[self.navigationItem setHidesBackButton:YES];

22

除了使用已推荐的方法去除返回按钮外,还要记住用户仍然可以在 iOS 7 及之后通过从左到右的滑动手势“弹出”到上一个屏幕。

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

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

1
Matt - 给你点赞。感谢你添加这个注释。非常有用。对于任何想知道弹出手势如何工作的人,只需在导航栏上从左向右滑动即可重现Matt在这里描述的内容。添加上述代码可以防止用户在包含它的视图控制器上执行此操作。 - noobzilla

20

为了澄清现有答案: hidesBackButton 属性是正确的答案,但很多答案都没有明确说明 self 是指什么。基本上,你应该在即将被推送(或刚刚被推送)到 UINavigationController 上的视图控制器中设置 self.navigationItem.hidesBackButton = YES

换句话说,假设我有一个名为 myNavControllerUINavigationController。我想在它上面放一个新视图,在这个过程中我不想再显示返回按钮。我可以像这样做:

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 所需要的。谢谢 Matt。 - 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

7

6

在我的情况下,我对目前的答案存在一些问题:

  • 仅在viewDidLoad/viewWillAppear内部隐藏了返回图标,并且"返回"字符串无效但仍然可见。
  • 在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接