这个 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 又是从哪里来的呢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥称为“业务逻辑”?这个词是从哪里来的? [关闭]

这个哈希是从哪里来的? [复制]

这个 VSCODE 智能感知是从哪里来的?

bigdata hadoop java codefor wordcount 修改

Codefores 932D Tree

CodeFores Round53(div.2) D.Berland Fair