iOS 8:UINavigationController 隐藏后退按钮
Posted
技术标签:
【中文标题】iOS 8:UINavigationController 隐藏后退按钮【英文标题】:iOS 8: UINavigationController hide back button 【发布时间】:2014-11-17 14:35:25 【问题描述】:在 ios 8(XCode 6.0.1、iPhone 6)中运行我的应用程序后,后退按钮没有隐藏。
我的代码:
- (void)removeCategoriesButton
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
[_navigationController.topViewController.navigationItem setHidesBackButton:YES];
[_navigationController.topViewController.navigationItem setLeftBarButtonItem:nil];
else
UIViewController *controller = _app.window.rootViewController;
if ([controller isKindOfClass:[UINavigationController class]])
UINavigationController *nav = (UINavigationController *)controller;
[nav.topViewController.navigationItem setHidesBackButton:YES];
[nav.topViewController.navigationItem setLeftBarButtonItem:nil];
但是后退按钮并没有隐藏(见截图):
UPD:
我在另一个模拟器中运行应用程序,我只在 iOS 8 上看到这个“错误”。
【问题讨论】:
在 iPad 上一切正常。后退按钮成功隐藏。 iOS 有这个 bug 吗? 也有这个问题,请问您找到解决方法了吗?对我来说,后退按钮也不起作用,除非我删除 setHidesBackButton:YES 请查看 self.navigationItem.backBarButtonItem = nil ***.com/a/21829432/2584566 【参考方案1】:这对我有用。
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[self.navigationItem setHidesBackButton:YES];
[self.navigationItem setTitle:@"Home"];
【讨论】:
这可行,但它会在隐藏之前暂时显示后退按钮 是的 - 我确实注意到了。我现在已经开始用 Swift 编写了,它似乎可以在 viewDidLoad 中正常工作。 hmm.. 奇怪,我也在使用 swift,但在 viewDidLoad 中仍然存在问题 快速代码 = self.navigationItem.hidesBackButton = true【参考方案2】:我尝试了很多答案,但唯一对我有用的是:
override func viewDidLoad()
super.viewDidLoad()
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
【讨论】:
这行得通。以前我尝试过[self.navigationItem setHidesBackButton:YES];
,但后退按钮文本仍然存在。【参考方案3】:
通过以下方法调用您的 ViewDidLoad:
目标-C:
self.navigationItem.leftBarButtonItem = nil;
或
self.navigationItem.hidesBackButton = YES;
斯威夫特:
navigationItem.hidesBackButton = true
【讨论】:
我尝试从viewDidLoad
调用此代码,但不起作用。
然后尝试在 ViewController 上调用它。例如,如果这是您的第二个 ViewController,请编写我在第一个 ViewController ViewDidLoad 方法上发布的代码【参考方案4】:
斯威夫特:
self.navigationItem.hidesBackButton = true
【讨论】:
【参考方案5】:我发现这是因为在 viewWillAppear 中推送了一个新视图,如果我将它移到 viewDidAppear 中,则返回按钮不显示。奇怪这个问题只出现在iOS8。
【讨论】:
很好的提示,但对我来说,它只在 iOS 7 中。【参考方案6】:试试这个:
[self.navigationItem setHidesBackButton:YES];
for (UIView *view in self.navigationController.navigationBar.subviews)
NSString *name = [NSString stringWithFormat:@"%@",view.class];
if ([name isEqualToString:@"UINavigationItemButtonView"] || [name isEqualToString:@"_UINavigationBarBackIndicatorView"])
[view setHidden:YES];
【讨论】:
【参考方案7】:你在哪里写的代码?
应该和你的视图控制器的 loadView/viewDidLoad: 方法一样简单
[self.navigationItem setHidesBackButton:YES];
这适用于我在 iPhone 6 上
【讨论】:
嗯...不工作。我在viewDidLoad
中添加了调用这个方法。
此代码 removeCategoriesButton
从控制器调用 - viewWillAppear
,如有必要。【参考方案8】:
尝试在viewWillAppear()
方法中使用self.navigationItem.hidesBackButton = true
,这对我有用。
【讨论】:
【参考方案9】:使用 setHidesBackButton 隐藏后退按钮仅在您没有自定义按钮时才有效。
来自方法参考:“当此导航项是顶部项时,如果后退按钮应该隐藏,则指定 true。如果后退按钮应该可见,则指定 false,假设它没有被自定义项替换。” (注意最后一行)
在这种情况下,简单的解决方案是首先将 leftBarButtonItem 设置为 nil。
斯威夫特 3.0:
self.navigationItem.leftBarButtonItem = nil
self.navigationItem.setHidesBackButton(true, animated: false)
【讨论】:
【参考方案10】:此错误仅在您使用 Storyboard 时发生。另一种解决方案是添加一个带有空标题的 UIBarButtonItem 来“伪造”它。
【讨论】:
【参考方案11】:我发现这样做的唯一方法是隐藏导航栏并在情节提要中添加导航栏并在下一个 ViewController 中重新显示导航栏。我所要做的就是在状态栏中添加一个标签,以便导航栏是统一的。我没有找到其他方法...
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:YES];
[[self navigationController] setNavigationBarHidden:YES animated:YES];
让导航栏显示在下一个viewcontroller中,声明在:
- (void)viewWillDisappear:(BOOL)animated
[[self navigationController] setNavigationBarHidden:NO animated:YES];
【讨论】:
以上是关于iOS 8:UINavigationController 隐藏后退按钮的主要内容,如果未能解决你的问题,请参考以下文章
功能差异,UINavigationController vs Only Storyboard Segue
在 UINavigationController 中设置自定义导航栏类
在 UINavigationController 中设置自定义导航栏类
在 Swift 2.0 中设置 UINavigationController 栏标题
UINavigationController -> UIViewController -> UIView -> UITableViewController?