iOS检查UINavigationController中是否显示后退按钮

问题描述 投票:1回答:3

在iOS项目中,我需要检查当前是否显示后退按钮。我尝试了SO上提供的一些解决方案,但没有一个对我有用。目前,我正在使用此代码]

NSArray *stack = navigationController.viewControllers;
int i = stack.count-2;

if (i>=0)
{
    UIViewController *backVC = (UIViewController*)[stack objectAtIndex:i];
    if (backVC.navigationItem.backBarButtonItem != nil) {
        NSLog(@"Back button is displayed!");
    }
}

但是日志中没有任何内容。如果我正确理解了苹果指南,那么我正在寻找位于索引n-2处的堆栈中的ViewController,该ViewController应该保留一个后退按钮。

我正在内部使用此代码-navigationController:willShowViewController:animated:

ios uinavigationcontroller
3个回答
9
投票

我今天遇到了同样的问题,在尝试了上述代码的变化之后,我决定使用以下方法检测是否应显示后退按钮:

 self.navigationController.navigationBar.backItem

来自文档:

如果最上面的导航项目的leftBarButtonItem属性为nil,则导航栏将显示一个后退按钮,其标题是从该属性中的项目派生的。如果导航栏的堆栈中只有一个项目,则此属性的值为nil ..

满足我需要的工作。希望对您有所帮助,如果没有,我很想听听您如何解决!


0
投票

有一种可能的方法,但这不是最干净的解决方案。

[查看UINavigationBar的子视图时,有一个私有视图,其类型为_UINavigationBarBackIndicatorView。如果您直接访问此应用,则您的应用将被商店拒绝。

但是,如果系统未添加任何后退按钮,该视图仍将保留,但其alpha值为0。

通过检查导航栏是否不包含Alpha值为零的视图,App可以检测是否存在默认的后退按钮。

__block BOOL backButtonIsHidden = NO;

[self.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull view, NSUInteger idx, BOOL * _Nonnull stop) {
    if(view.alpha == 0)
    {
        backButtonIsHidden = YES;
        *stop = YES;
    }
}];

0
投票

这更可靠,并且可能是正确的方法

Swift:

guard let navigationStack = navigationController?.viewControllers, navigationStack.count > 1 else {
    // The back button is not present
    return
}
// The back button is present

© www.soinside.com 2019 - 2024. All rights reserved.