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