0

我已经设置了一个 UINavigation 控制器,它使用 AppDelegate 作为主要联系点。

我有不同的运行方法,例如 presentHomeViewController、presentLoginViewController,它们将不同的视图控制器推送到导航控制器。

应用程序委托 - didFinishLaunching

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

self.revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:navController];

[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionNone];
[self.revealSideViewController setPanInteractionsWhenClosed:PPRevealSideInteractionContentView | PPRevealSideInteractionNavigationBar];

self.window.rootViewController = self.revealSideViewController;

这是正确的过程吗?

- (void)presentHomeViewController {
// We start by dismissing the ModalViewConrtoller which is LoginViewController from the welcomeview
[self.welcomeViewController dismissModalViewControllerAnimated:YES];

// Check if the home view controller already exists if not create one
if (!self.homeViewController) {
    NSLog(@"presentHomeViewController- Creating the Home View controller");
    homeViewController = [[MyHomeViewController alloc] initWithNibName:@"MyHomeViewController" bundle:nil];
}

// Push the homeViewController onto the navController
NSLog(@"presentHomeViewController");
self.navController.navigationBarHidden = NO;
[self.navController setTitle:@"Home"];
[self.navController pushViewController:homeViewController animated:NO];

如果我然后将以下内容添加到不同的类:

[self.navigationController pushViewController:accountViewController animated:NO];

没有视图被推送到堆栈,我应该像我一直在做的那样控制 AppDelegate 中的所有移动,还是有更好的方法来解决这个问题?

4

1 回答 1

0

编辑

感谢您发布您的代码。因此,为了首先解决您的最后一个问题,我不建议从应用程序委托控制您的导航堆栈。您应该从作为导航控制器子级的视图控制器控制堆栈。

至此,请记住视图控制器的层次结构:UINavigationController继承自UIViewController,并UIViewController为您在导航布局中看到的所有内容(例如导航项和标题)定义了属性。更重要的是,它还具有父视图控制器、呈现它的视图控制器和导航控制器的属性。因此,考虑到层次结构,您的应用程序委托应该只实例化导航控制器的根 VC 和导航控制器本身,然后设置导航控制器的根 VC。

从那里,您应该从 VC 本身推送和弹出其他 VC。请记住,每个 VC 都有一个属性,该属性会自动设置为指向它所属的导航控制器。这就是为什么[self.navigationController pushViewController:]有效。例如,如果我有一个根 VC 为 a 的导航控制器UITableViewController,并且点击表视图中的一项将新的 VC 推送到堆栈中,我会从表 VC 中推送该 VC,而不是从导航控制器类中推送或应用程序委托。

对不起,如果这令人困惑。请让我知道是否需要澄清,我会尽力而为。否则,希望这能让你走上正轨。

于 2012-10-29T17:09:51.030 回答