0

我有一个 UINavigationController (A),它有几个子视图,它们也是 UIViewControllers (B 和 C)。主 UINavigationController (A) 位于 UITabViewController (D) 内部。

我正在尝试在 B 中推送视图控制器: [self.navigationController pushViewController... etc]

现在,backBarButtonItem 带有错误的文本。它没有说“返回”,而是说“项目”。这可能是因为我的链中的一个视图控制器的标题设置为“项目”,或者它可能完全为零。

我的问题是,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

我想在这里学习这个原理,这样我才能真正了解这个项目是从哪里填充的,以及正确的做法是什么。

4

1 回答 1

2

假设您的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";
}
于 2013-04-18T22:07:24.597 回答