我有一个UINavigationController(A),它有一些子视图,也是UIViewControllers(B和C)。主UINavigationController(A)位于UITabViewController(D)内部。
我正在尝试在B中推送视图控制器:
[self.navigationController pushViewController... etc]
现在,backBarButtonItem带有错误的文本。它没有说'Back',而只是说'Item'。这很可能是因为我链中的一个视图控制器的标题设置为'Item',或者它可能完全没有。
我的问题是,backBarButtonItem从哪里生成?
我尝试了一些不起作用的不同东西。在我推动视图控制器之前,我在B中尝试了这些代码行。他们都没有工作。
self.presentingViewController.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc
self.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc
self.navigationController.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"... etc
我想在这里学习原理,以便我真正了解这个项目的填充位置以及正确的方法。
答案 0 :(得分:2)
假设您的C
控制器位于导航控制器堆栈的顶部,而您的B
控制器位于此之下。 E.g。
navigationController.viewControllers = @[ bViewController, cViewController ];
因此导航控制器正在显示cViewController.view
。
导航控制器使用其堆栈上的第二个到顶部控制器来配置后退按钮。在这种情况下,它使用bViewController
配置后退按钮。这是它的算法:
UINavigationItem *navigationItem = bViewController.navigationItem;
UIBarButtonItem *barItem = navigationItem.backBarButtonItem;
if (barItem.image != nil) {
show a back button containing barItem.image;
}
else if (barItem.title != nil) {
if (barItem.title.length > 0) {
show a back button containing barItem.title;
} else {
don't show a back button;
}
}
else if (navigationItem.title != nil) {
if (navigationItem.title.length > 0) {
show a back button containing navigationItem.title;
} else {
don't show a back button;
}
}
else {
show a back button containing @"Back";
}