设置 uinavigationitem 的后退按钮不起作用

Posted

技术标签:

【中文标题】设置 uinavigationitem 的后退按钮不起作用【英文标题】:Setting uinavigationitem's back button not working 【发布时间】:2014-03-31 14:17:31 【问题描述】:

在阅读了一堆关于 SO 的类似问题后,我发现为了使用自定义后退按钮视图,我应该将导航控制器的导航栏的导航项的左按钮项设置为自定义视图,但无论如何我确实被默认设置卡住了。我已经尝试在我想要导航回来的视图控制器以及我要导航回的视图控制器中进行设置,但无济于事。有什么想法我可能做错了吗?

- (void)loadView
    [super loadView];
     UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc]initWithCustomView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"back-btn"]]];
    self.navigationController.navigationItem.leftBarButtonItem = backButtonItem;
    self.navigationController.navigationItem.leftBarButtonItem.tintColor = [UIColor whiteColor];
    [self.navigationController setNavigationBarHidden:YES animated:YES];

【问题讨论】:

你没有将你的 navigationController 添加到任何 superview 感谢您的回复。导航控制器从另一个视图控制器以模态方式呈现。 尝试做同样的事情,但在viewWill/DidAppear 【参考方案1】:

你做错的关键是在导航控制器而不是视图控制器上使用栏按钮项。引用苹果的View Controller Catalog for ios

在导航界面中,导航堆栈中的每个 content 视图控制器都提供一个导航项作为其 navigationItem 属性的值。

强调我的;内容视图控制器是您的自定义视图控制器。试试这个:

self.navigationItem.leftBarButtonItem = backButtonItem;

您需要在所有应具有自定义按钮的视图控制器中执行此操作,因此我建议您创建自己的基础视图控制器类,该类子类为 UIViewController 并实现自定义后退按钮,并将此基础视图控制器用作父级您的其他视图控制器。

您正在隐藏导航栏,如果您希望它显示自定义后退按钮,这可能不是一个好主意。

通过替换标准的后退按钮,您将失去其点击行为。在栏按钮项的自定义视图中使用UIButton,而不是UIImageView

此外,将此设置代码放在viewDidLoad 而不是loadView 中会更传统。

所以我会这样做:

- (void)viewDidLoad

    [super viewDidLoad];

    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [backButton setBackgroundImage:[UIImage imageNamed:@"back-btn"] forState:UIControlStateNormal];
    [backButton sizeToFit];
    [backButton addTarget:self action:@selector(popNavigationController:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = backButtonItem;


- (void)popNavigationController:(id)sender

    [[self navigationController] popViewControllerAnimated:YES];

请注意,如果您使用自定义后退按钮,则从屏幕边缘滑动到返回手势将不起作用。请参阅this Stack Overflow question 了解一些潜在的解决方案,但这很繁琐。

【讨论】:

太棒了,非常感谢您的帮助。您是否知道一个很好的备忘单来帮助推理何时应该调用设置代码(例如,在 viewdidload、viewwillappear 等中)? 我不知道备忘单。 loadView 应该创建主视图并将其设置为视图控制器的view 属性,并且通常不会被覆盖并且不会调用super(因为视图只能创建一次)。 viewDidLoad 执行任何其他需要在视图加载时进行一次的设置,并且应该调用 super 完美。再次感谢。

以上是关于设置 uinavigationitem 的后退按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

检测长按 UINavigationItem 的后退按钮

UINavigationItem 后退按钮返回到上一个导航项,但视图没有改变

使用 UINavigationItem 类的属性 leftItemsSupplementBackButton

后退按钮项目替换为“后退”

引用 UINavigationBar 上的后退按钮

UINavigationItem 标题视图的框架