【问题标题】:Ignoring presses on back button from Navigation Bar on iOS忽略iOS导航栏上的后退按钮
【发布时间】:2014-08-07 12:37:38
【问题描述】:

我正在尝试自定义应用程序导航栏的行为。我已经设法将UINavigationController 子类化为每次按下后退按钮时运行自定义代码,但导航栏标题仍然发生变化并且再次按下按钮会忽略我的代码(可能是因为它和整个不同的控制器?)。

我想要实现的是告诉UINavigationController 在某些条件下(已经定义并且来自自定义导航控制器的控制器)忽略对后退按钮的按下,从而保持当前视图和导航栏完好无损。

我怎样才能做到这一点?我只覆盖了 (UIViewController *)popViewControllerAnimated:(BOOL)animated 函数。

我的代码:

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    if(self.auxController == nil)
    {
        NSLog(@"[CustomNavigationController.m]: WARNING: No Auxiliar Controller assigned to Navigation controller");
        return [super popViewControllerAnimated:animated];
    }
    else
    {
        NSLog(@"[CustomNavigationController.m]: Navigation Stack has %d remaining levels",[[[self auxController] parentLayout] count]);
        if([[[self auxController] parentLayout] count] > 0)
        {
            NSLog(@"[CustomNavigationController.m]: Falling to previous navigation level");
            [[self auxController] navBack];
        }
        else
        {
            NSLog(@"[CustomNavigationController.m]: No more navigation levels in stack, falling to previous view");
            self.auxController = nil;
            return [super popViewControllerAnimated:animated];
        }
    }
    return nil;
}

【问题讨论】:

  • 为什么不隐藏按钮而不是禁用按钮
  • 因为按钮在用户按下时会运行一些自定义代码,所以它需要可见。我不想隐藏或禁用它,只是以编程方式忽略按下然后运行一些代码
  • 您可以创建一个自定义后退按钮(虽然看起来会略有不同)并将其作为左侧栏项
  • 嗯,有一个选择。这个项目看起来略有不同并不重要,所以什么都没有丢失,但我仍然更喜欢更清洁的解决方案。如果没有出现,我会选择这个。谢谢

标签: ios objective-c uinavigationcontroller


【解决方案1】:

正如@Stonz2 在 cmets 中提到的,最干净的解决方案是使用您自己的自定义后退按钮。 只需隐藏导航控制器中的后退按钮并设置您自己的左侧BarButtonItem。在这个BarButtonItem 中,您可以手动返回,也可以不执行任何操作。

用代码说话:

UIBarButtonItem * customBackButton = [UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain  target:self action:@selector(backButtonPressed:)]
navigationItem.hidesBackButton = true;     
navigationItem.leftBarButtonItem = customBackButton;

别以为还有什么比这更清楚的!

【讨论】:

  • 好吧,我猜就是这样。感谢您和 Stonz,我将按照你们的指示继续添加自定义按钮。
  • 只有一件事,我已经尝试过你的代码,但它似乎并不正确,我可能弄错了,但我相信它是 navigationItem 而不是 navigationBar
  • 在实现它之后,我不得不承认它比我预期的要干净得多,删除了很多代码。谢谢!
  • 它对您有帮助 - 是的,当然,它是 NavigationItem,而不是 NavigationBar - 我编辑了它。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2023-03-16
相关资源
最近更新 更多