0

我想推新的根控制器到導航堆棧,但使用側面顯示菜單。UINavigation推新的根控制器

我的應用程序委託有以下幾點:

welcomeViewController = [[MyWelcomeViewController alloc] initWithNibName:@"MyWelcomeViewController" bundle:nil]; 
navController = [[UINavigationController alloc] initWithRootViewController:welcomeViewController]; 
navController.navigationBarHidden = YES; 

// Then we setup the reveal side view controller with the root view controller as the navigation controller 
self.revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:navController]; 
[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionNone]; 
[self.revealSideViewController setPanInteractionsWhenClosed:PPRevealSideInteractionContentView | PPRevealSideInteractionNavigationBar]; 

// Then we make the window root view controller the reveal side view controller 
self.window.rootViewController = self.revealSideViewController; 

一旦顯示歡迎視圖控制器,用戶登錄一旦在後續工序中再次記錄在應用委託運行。

self.navController.navigationBarHidden = NO; 
[self.navController setTitle:@"Home"]; 
[self.navController pushViewController:homeViewController animated:NO]; 

然後我有一個側視圖控制器設置,這是一個帶有自定義單元格設置的表格視圖。

當選擇一行時,我需要將一個新的根控制器推到導航控制器上。我通過在表格視圖中對所選單元格使用以下內容來嘗試此操作。

MyAccountViewController *accountViewController = [[MyAccountViewController alloc] init]; 
[self.navigationController setViewControllers:[NSArray arrayWithObject:accountViewController] animated:NO]; 

不幸的是,這不起任何作用。如果我將代碼添加到App Delegate中,然後從表視圖控制器中調用該方法,那麼它將起作用,但不是從表視圖本身的.m文件中起作用。添加一個日誌我可以看到上面是運行,只是沒有做任何事情。

我不確定是否需要在上面做任何不同的事情。例如,完全彈出當前顯示的視圖,然後重新創建導航控制器和PPRevealSideViewController。如果我應該這樣做,我不確定如何彈出所有當前視圖,然後將新的視圖推送到窗口,而不是從AppDelegate。

我不想在App Delegate中這樣做的原因是因爲這是不正確的方法來處理這個問題,然後我需要一個單獨的方法來處理每個我想從菜單中推出的新根控制器,所以應用程序代表將變得非常大。

enter image description here

回答

0

檢查UINavigationController.h:

@interface UIViewController (UINavigationControllerItem) 
@property(nonatomic,readonly,retain) UINavigationController *navigationController; // If this view controller has been pushed onto a navigation controller, return it. 

這意味着當你做myViewController.navigationController你要麼得到nil如果myViewController沒有推到任何navController或navController參考myViewController推入。

據我所知,您的tableViewController沒有推入navController堆棧,這意味着您無法使用tableViewController.navigationController獲取navController。相反,你需要使用anyViewControllerInTheStack.navigationController或者如果navController是你keyWindowrootViewController,通過

((UINavigationController*)[[UIApplication sharedApplication] keyWindow].rootViewController) 
+0

我不使用UINavigationController.h導航控制器是在代碼中設置的,因此不需要頭文件和imp文件。我如何使用提供的底部代碼更新rootViewController? – StuartM

+0

You ** do **使用並導入UINavigationController.h,因爲在您開始使用的應用程序模板中有'#import ',通常它位於前綴頭文件.pch文件中。 –

+0

謝謝,我肯定覺得這是確切的答案,但我無法讓它工作。比方說,我有一個主視圖控制器(在navController堆棧上),然後tableViewController不在堆棧上。我如何從表格視圖控制導航控制器?你的回答中的最後一點提到了從堆棧中的視圖控制器進行控制,所以這種情況來自Home View Controller。你有代碼示例如何實現這一目標?我是否需要在表視圖中再次分配init Home View Controller,然後嘗試並控制它?謝謝 – StuartM

0

添加這樣的事情你AppDelegate.h:

#define XAppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 

現在,您可以訪問任何伊娃你的項目中的任何.m文件的AppDelegate。

MyAccountViewController *accountViewController = [[MyAccountViewController alloc] init]; 
[XAppDelegate.navController pushViewController:accountViewController animated:NO]; 

確保您添加了正確的導入。 還有一件事:一旦你完成登錄,從你的navcontroller彈出登錄窗口很好。

希望這會有所幫助。

+0

添加define行我收到一個錯誤[,但我不知道在哪裏? – StuartM

+0

你是否在你的導入下添加它?我直接從我使用這些東西的代碼中複製它。這個對我有用。 – ThefunkyCoder

+0

您的進口商品是什麼意思? – StuartM

相關問題