这个backBarButtonItem又来自哪里?

时间:2013-04-18 21:16:36

标签: uinavigationcontroller pushviewcontroller backbarbuttonitem

我有一个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

我想在这里学习原理,以便我真正了解这个项目的填充位置以及正确的方法。

1 个答案:

答案 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";
}