Ios 如何禁用导航栏中的“后退”按钮

Ios 如何禁用导航栏中的“后退”按钮,ios,swift,storyboard,Ios,Swift,Storyboard,是否有任何官方方法可以设置UIBarButtonItem.enabled属性?我试图在上一个控制器中设置backButtonItem。但是已启用属性被忽略 更简单的是 我不想找到一些解决方案,比如“制作你自己的leftBarButtonItem并设置它的alpha…” 编辑:我不想隐藏它,只是用暗淡的颜色和禁用的用户交互来禁用它。这与禁用的leftBarButtonItem的行为完全相同。如果要隐藏它,UInavigationItem有一个hidesBackButton属性。在ViewContr

是否有任何官方方法可以设置
UIBarButtonItem.enabled
属性?我试图在上一个控制器中设置backButtonItem。但是
已启用
属性被忽略

更简单的是

我不想找到一些解决方案,比如“制作你自己的leftBarButtonItem并设置它的alpha…”


编辑:我不想隐藏它,只是用暗淡的颜色和禁用的用户交互来禁用它。这与禁用的
leftBarButtonItem的行为完全相同。如果要隐藏它,
UInavigationItem
有一个
hidesBackButton
属性。

在ViewController2.swift类中添加以下代码

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.hidesBackButton = true;
    }
// 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

它将隐藏您的后退按钮。

从今天起,无法使用
enabled
属性禁用后退按钮。
backBarButtonItem
属性将为
nil
,除非您创建自定义项,即使这样,它也会忽略
已启用的
属性。有几种(不令人满意的)方法可以解决这个问题

隐藏按钮 这是苹果希望你做的,因为他们忽略了
enabled
属性。这很简单

navigationItem.hidesBackButton = true  
除非你有充分的理由,否则应该是首选方法

禁用并着色导航栏 您可以在整个导航栏上禁用用户交互,并将其着色以使“后退”按钮显示为禁用

navigationController?.navigationBar.isUserInteractionEnabled = false
navigationController?.navigationBar.tintColor = UIColor.lightGray
不幸的是,这也会影响导航栏中的其他元素,因此,例如,如果右侧有另一个栏按钮项,则它可能不是一个选项

使用自定义左栏按钮项
leftBarButtonItem
不会忽略
enabled
属性,因此您可以创建自定义项并在激活时手动触发pop

navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(ThisClass.backButtonTapped))
...
navigationItem.leftBarButtonItem?.isEnabled = false

func backButtonTapped() {
    self.navigationController?.popViewController(animated: true)
}

但是,这将不会有带前导三角形指示器的后栏按钮样式。

我知道这是一个旧线程,但这可能会帮助其他人。 正如hennes提到的,您不能再禁用“后退”按钮。相反,您需要禁用整个导航栏

我采取的方法是禁用导航栏,然后对导航栏的子视图应用0.5 alpha

在ViewController类中:

func changeBarButtons(alpha:CGFloat){
navigationController?.navigationBar.subviews.forEach{firstViews in
firstViews.subviews.forEach{中的视图
如果[“\uUIButtonBarButton”,“\uUIButtonBarstackView”]包含(类型(of:view).description()){
view.alpha=alpha
}
}
}
}
func集合(加载:布尔){
设alpha:CGFloat=加载?0.5:1
navigationController?.navigationBar.isUserInteractionEnabled=!正在加载
更改按钮(alpha:alpha)
}

请记住,苹果可以随时更改该类的名称。尽管如此,他们这样做的可能性很小。如果不介意视图控制器的标题淡出,则可以将alpha应用于所有子视图,而无需检查类名。

不要尝试禁用自定义后退按钮(不起作用),只需设置一个已禁用的新按钮即可。您可以通过
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

我尝试了所有可能的选项,但它不可能禁用后退按钮查看链接,或者你必须创建自定义后退按钮。它隐藏和禁用。问题是如何禁用按钮。我不想失去默认的后退手势和领先的三角形指示器。看来这是不可能实现的。感谢您的详细回答。导航栏userInteractionEnabled=NO在iOS 10上似乎对我不起作用?还有其他人有这个问题吗?我想在“后退”按钮的右边添加一个按钮。当我使用leftBarButtonItem时,后退按钮自动隐藏。使用导航控制器的后退按钮默认功能一次显示两个按钮的任何解决方案。我很困惑。你是说我可以禁用自定义栏按钮吗?我可以做到这一点,但设置为禁用,我无法使它有一个更轻的颜色。有内置的功能吗?