0

我有一个UINavigationController(A),它有几个子视图,它们也是UIViewControllers(B和C)。主要的UINavigationController(A)在UITabViewController(D)里面。这个backBarButtonItem又来自哪里?

我试图B内部推视图控制器: [self.navigationController pushViewController... etc]

现在,backBarButtonItem来通过与错误的文字。它不是说'返回',而是说'物品'。这可能是因为我的链中的一个视图控制器的标题设置为“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

是否有涉及的导航控制器?如果是这样,在哪里?哪个视图控制器是导航控制器的子项?哪个视图控制器是导航控制器的父级,还是窗口的根视图控制器? –

+0

我的不好,我解决了它,并引用它在链中的UINavigationController。谢谢! – Brett

回答

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"; 
} 
+0

超级有用,谢谢你的这些细节。 – Brett