iOS 8中如何禁用UINavigationController的返回按钮

17
在我的导航控制器中,我需要暂时禁用返回按钮。我知道可以使用以下代码或类似的代码隐藏它:[self.navigationController.navigationItem setHidesBackButton:YES animated:YES];但这不是我想要的,我希望将返回按钮置灰并且对用户触摸事件不起作用。有没有一种方法可以在不替换默认返回按钮的情况下实现这一点?谢谢!
5个回答

20
为了禁用后退按钮,以下指令可以使其按您的要求进行操作:
启用:
self.navigationController.navigationBar.userInteractionEnabled = YES;
self.navigationController.navigationBar.tintColor = [UIColor blueColor];

禁用:

self.navigationController.navigationBar.userInteractionEnabled = NO;
self.navigationController.navigationBar.tintColor = [UIColor lightGrayColor];

更新:

iOS 7及以上版本中,还有一个你需要禁用的在UINavigationBar上的滑动操作。

// You wrap it an 'if' statement so it doesn't crash
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
// disable the interactivePopGestureRecognizer
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

还有一个你可能会“碰到”的滑动功能。我更新了如何禁用它。 - Adrian
1
这会禁用所有按钮,而不仅仅是返回按钮。 - meaning-matters

14

这将隐藏后退按钮,使其对用户不可访问。并且它禁用了滑动手势。

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

Swift:

navigationItem.setHidesBackButton(true, animated: true)

详细信息请参阅Apple文档


比@adrian更简单 - user4141198
2
正确的做法。这也禁用了滑动识别器。 - Darren

6

我知道这个问题很旧了,但我也遇到了这个问题。

在我的情况下,我有两种方案:一种是禁用后退按钮,另一种是禁用所有导航按钮。我的解决办法是在两种情况下都完全禁用导航栏:

self.navigationController.view.userInteractionEnabled = NO;

这样做不会显示禁用的按钮,但会防止触摸。

希望这能帮到你。


7
我认为这实际上会禁用顶部视图控制器整个视图的交互...! - fatuhoku
我的使用情况是在显示进度条并等待网络响应时禁用返回按钮,因此这个答案非常完美。 - Justin Meiners

3
我相信以下内容应该有所帮助:
self.navigationController.navigationItem.backBarButtonItem.enabled = NO;

更新

对不起,各位,我的想法没有实现。

看来属性backBarButtonItem仅设计用于设置自定义标题或后退按钮图像。

根据文档:

如果您想为后退按钮指定自定义图像或标题,则可以将自定义工具栏按钮项(带有自定义标题或图像)分配给此属性。在配置工具栏按钮项时,请不要将自定义视图分配给它;导航项目无论如何都会忽略后退栏按钮中的自定义视图。

此属性的默认值为nil。

不幸的是,我没有发现任何禁用后退按钮并保存其本机外观和行为的方法,因为每次尝试将自定义UIBarButtonItem设置到navigationItem.backBarButtonItem属性中时,它都会以相应的本机后退按钮样式进行更新,它总是enabled == YES

我认为这是由Apple出于某种原因而做的,因为我们基本上不应强迫用户停留在详细屏幕上并阻止他返回。 此外,在iOS7及更高版本中,如果您未禁用它,则用户始终可以使用从左侧边缘滑动手势返回。

我唯一能推荐的丑陋方法是创建一个带有“返回”标题、目标和选择器的自定义UIBarButtonItem,并将其设置到leftBarButtonItem中。默认情况下,它将替代本机后退按钮。 然后,您可以像往常一样使用navigationItem.leftBarButtonItem.enabled = NO将其禁用。

不幸的是,它看起来和行为(根据可用空间更新标题)与本机后退按钮不同:(


1
那个不起作用。我尝试在viewDidLoad和viewDidAppear中调用你的代码,但无论哪种情况下都似乎没有任何效果。 - David Silverfarmer
1
@user3636891 我也同意,这段代码对我也不起作用。 - race_carr

0

在上一个视图控制器的导航项上设置一个禁用的返回按钮。如果您已经有一个自定义返回按钮,请不要试图禁用它,这样不起作用。只需设置一个新的禁用按钮即可。您可以通过 UINavigationBar.backItem 属性访问前一个导航项。

// set disabled back button
let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: nil, action: nil)
backButton.isEnabled = false
navigationController?.navigationBar.backItem?.backBarButtonItem = backButton

// disable pop gesture
navigationController?.interactivePopGestureRecognizer?.isEnabled = false

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