如何防止UINavigationItem被推送到由UINavigationController管理的UINavigationBar?

时间:2014-05-20 20:36:49

标签: ios cocoa-touch uinavigationcontroller uikit uinavigationbar

我想构建一个自定义导航栏,它可以处理不同于库存UINavigationBar的堆栈导航。为了做到这一点,核心要求是导航栏永远不会更改其UINavigationItem对象集,以便它始终具有一个具有相同左右栏项和相同自定义视图的项。自定义视图旨在具有面包屑样式视图,允许用户一次返回1个或多个视图控制器。

我正在尝试使用一个使用自定义UINavigationController子类的普通UINavigationBar来实现这一点:

window.rootViewController = [[UINavigationController alloc] initWithNavigationBarClass:[BreadcrumbNavigationBar class] toolbarClass:nil];

在bar类中,我(现在)拦截了所有可能修改导航栏中UINavigationItem的调用而不执行任何操作:

@implementation BreadcrumbNavigationBar

- (void)setItems:(NSArray *)items
{
}

- (void)setItems:(NSArray *)items animated:(BOOL)animated
{
}

- (void)pushNavigationItem:(UINavigationItem *)item animated:(BOOL)animated
{
}

- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated
{
    return nil;
}

@end

然而,这不起作用。如果我导航到新屏幕,导航栏会将新项目推送到其堆栈上,表面上不应该。但是由于某种原因,新项目上的后退按钮不会返回。

我想做的是什么?使用UINavigationController的替代方法是使用自定义导航控制器来模仿UINavigationController的外观和行为,但在导航条上表现得如何;然而,有许多不错的行为UINavigationController让我免费,我不想在可能的情况下重新实施。

修改

发布后我找到了这篇文章:

UINavigationBar -pushNavigationItem never called when new controller is pushed onto UINavigationController stack

如果我也实现了- (void)pushNavigationItem:(UINavigationItem *)item那么第一个导航项的工作就会有所作为;但是如果我把这些方法填满一点只能在items数组中保留一个项目,当我将一个视图控制器推到堆栈上时,导航条的行为就好像来自根视图控制器的UIBarButtonItem不再一样即使在pushNavigationItem方法中阻止了项目被推送,也会出现。

1 个答案:

答案 0 :(得分:0)

我建议您创建一个标准UINavigationController作为父容器。 rootViewController将是一个UINavigationController子类,它隐藏其UINavigationBar并在其导航项中具有正确的左右导航按钮。

    //You would need to populate these variables
    UIViewController * actualController;
    UIBarButtonItem * rightBarButtonItem;
    UIBarButtonItem * leftBarButtonItem;

    UINavigationController * childNavigator = [[UINavigationController alloc] initWithRootViewController:actualController];
    [childNavigator setNavigationBarHidden:YES];
    [[childNavigator navigationItem] setRightBarButtonItem:rightBarButtonItem];
    [[childNavigator navigationItem] setLeftBarButtonItem:leftBarButtonItem];

    UINavigationController * parentNavigator = [[UINavigationController alloc] initWithRootViewController:childNavigator];

您的实际视图控制器会推送并弹出没有UINavigationController的孩子UINavigationBar。显示的UINavigationBar永远不会根据推/弹动作进行更改。