我想构建一个自定义导航栏,它可以处理不同于库存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
让我免费,我不想在可能的情况下重新实施。
修改
发布后我找到了这篇文章:
如果我也实现了- (void)pushNavigationItem:(UINavigationItem *)item
那么第一个导航项的工作就会有所作为;但是如果我把这些方法填满一点只能在items数组中保留一个项目,当我将一个视图控制器推到堆栈上时,导航条的行为就好像来自根视图控制器的UIBarButtonItem
不再一样即使在pushNavigationItem
方法中阻止了项目被推送,也会出现。
答案 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
永远不会根据推/弹动作进行更改。