这个 backBarButtonItem 又是从哪里来的呢?
Posted
技术标签:
【中文标题】这个 backBarButtonItem 又是从哪里来的呢?【英文标题】:Where does this backBarButtonItem come from again? 【发布时间】:2013-04-18 21:16:35 【问题描述】:我有一个 UINavigationController (A),它有几个子视图,它们也是 UIViewControllers (B 和 C)。主 UINavigationController (A) 位于 UITabViewController (D) 内部。
我正在尝试在 B 中推送视图控制器:
[self.navigationController pushViewController... etc]
现在,backBarButtonItem 带有错误的文本。它没有说“Back”,而是说“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
我想在这里学习这个原理,以便我真正了解这个项目是从哪里填充的,以及正确的做法是什么。
【问题讨论】:
是否涉及导航控制器?如果有,在哪里?哪些视图控制器是导航控制器的子级?哪个视图控制器是导航控制器的父级,还是窗口的根视图控制器? 我的错,我修复了它并引用了它在链中的 UINavigationController。谢谢! 【参考方案1】:假设您的 C
控制器位于导航控制器堆栈的顶部,而您的 B
控制器位于其下方。例如
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";
【讨论】:
以上是关于这个 backBarButtonItem 又是从哪里来的呢?的主要内容,如果未能解决你的问题,请参考以下文章