1

我正在尝试将新的根控制器推送到导航堆栈,但使用侧面显示菜单。

我的应用程序委托具有以下内容:

    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;

显示欢迎视图控制器后,用户登录。登录后,以下过程再次从 App Delegate 运行。

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 中这样做的原因是因为它是处理这个问题的不正确方法,然后我需要为每个我想从菜单中推送的新根控制器使用单独的方法,所以 App Delegate 会变成很大。

在此处输入图像描述

4

2 回答 2

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.

这意味着当你这样做时,如果没有被推送到任何 navController 或 navController 引用被推送到,myViewController.navigationController你会得到。nilmyViewControllermyViewController

据我了解,您tableViewController没有被推入 navController 堆栈,这意味着您无法使用 tableViewController.navigationController. 相反,您需要使用anyViewControllerInTheStack.navigationController或者如果 navController 是rootViewController您的keyWindow, 通过

((UINavigationController*)[[UIApplication sharedApplication] keyWindow].rootViewController)
于 2012-11-05T18:15:21.283 回答
0

将类似这样的内容添加到您的 AppDelegate.h:

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

现在,您可以从项目中的任何 .m 文件访问 AppDelegate 的任何 iVar。

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

确保添加正确的导入。还有一件事:完成登录后,最好从导航控制器中弹出登录窗口。

希望这可以帮助。

于 2012-11-05T18:16:03.777 回答