我在基於標籤欄的應用程序中構建了導航視圖控制器。在控制器中,應用程序會顯示帶有一些註釋的地圖視圖。在導航欄上,有一個欄按鈕「列表」。當用戶按下按鈕時,包含註釋列表的表格視圖將被推入導航堆棧。在表格視圖中,我還實現了一個自定義欄按鈕,如果用戶按下按鈕,地圖視圖將彈出到導航控制器中。UINavigationView問題
問題出在這裏,這個應用程序工作正常,但是如果我按下「List」按鈕,並且一旦tableview控制器加載後,我通過按下「Map」按鈕返回到地圖視圖,然後切換幾次這樣的看法。首先視圖切換正常,但在幾圈之後(經過多次測試,這個數字是3),當我再次按下「List」按鈕時,問題如下所示: tableview似乎被推入堆棧(從後面按鈕顯示在導航欄上),但tableview沒有顯示,它仍然是地圖視圖顯示。如果我現在按下後退按鈕,導航控制器中的根視圖控制器會顯示,但是當我想切換回子視圖控制器(tableview控制器)時,應用程序終止。
對不起,我無法在此問題插入圖像,但可以有問題的截圖這裏: http://i.stack.imgur.com/hNYsX.png
這裏是我視圖控制器之間進行切換的代碼:
在的根視圖控制器導航視圖控制器:
ListViewController *flipListViewController = [[ListViewController alloc]initWithStyle:UITableViewStylePlain];
AppDelegate *delegate = [[UIApplication sharedApplication]delegate];
UINavigationController *navController = [delegate navigationController];
//Flip Animation
[UIView beginAnimations:nil context:nil];
[navController pushViewController:ListViewController animated:NO];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.7];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:navController.view cache:NO];
[UIView commitAnimations];
[navController release];
[flipListViewController release];
這裏我自定義過渡動畫。在子視圖(表視圖控制器)中,我使用以下代碼來彈出根視圖控制器。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.7];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO];
[self.navigationController popViewControllerAnimated:NO];
[UIView commitAnimations];
謝謝!這解決了我的問題。但是,你能解釋爲什麼應該使用self.navigationController而不是app Delegate的導航控制器?我使用應用程序委託的控制器,因爲我看到一些使用此方法的示例。 – Jing
因爲您爲每個選項卡的視圖控制器都有一個導航控制器,所以它們也不同,應用程序委派導航控制器不適合您的情況,因爲默認情況下您將tabBarController的視圖添加到窗口。所以你需要使用self.navigationController。總是記得每個視圖控制器有一個導航控制器,如果它的根控制器有一個導航控制器 –