在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:
我今天遇到了同样的问题,在尝试了上述代码的变化之后,我决定使用以下方法检测是否应显示后退按钮:
self.navigationController.navigationBar.backItem
来自文档:
如果最上面的导航项目的leftBarButtonItem属性为nil,则导航栏将显示一个后退按钮,其标题是从该属性中的项目派生的。如果导航栏的堆栈中只有一个项目,则此属性的值为nil ..
满足我需要的工作。希望对您有所帮助,如果没有,我很想听听您如何解决!
有一种可能的方法,但这不是最干净的解决方案。
[查看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;
}
}];
这更可靠,并且可能是正确的方法
Swift:
guard let navigationStack = navigationController?.viewControllers, navigationStack.count > 1 else {
// The back button is not present
return
}
// The back button is present