UINavigation推送新的根控制器

时间:2012-11-05 17:07:59

标签: ios ios5 uinavigationcontroller automatic-ref-counting 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;

一旦显示欢迎视图控制器,用户就会登录。登录后,以下过程将再次从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代表会变得非常大。

enter image description here

2 个答案:

答案 0 :(得分: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推送到任何navController或推送到navController参考myViewController,您将获得myViewController

据我所知,tableViewController未被推入navController堆栈,这意味着您无法使用tableViewController.navigationController获取navController。相反,您需要使用anyViewControllerInTheStack.navigationController或者如果navController是rootViewController的{​​{1}},则

keyWindow

答案 1 :(得分:0)

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

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

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

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

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

希望这有帮助。