设置导航控制器和各种视图加载

时间:2012-10-29 17:03:23

标签: ios ios5 uiviewcontroller uinavigationcontroller uinavigation

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

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

App Delegate - 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中的所有移动,或者是否有更好的方法来解决这个问题,那么没有任何视图被推入堆栈?

1 个答案:

答案 0 :(得分:0)

修改

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

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

从那里开始,你应该从VC自己推动并弹出其他风险投资。请记住,每个VC都有一个属性,该属性会自动设置为指向它所属的导航控制器。这就是[self.navigationController pushViewController:]有效的原因。例如,如果我有一个导航控制器,其根VC是UITableViewController,并且点击表视图中的一个项目将一个新VC压入堆栈,我会从VC表中推送该VC而不是来自导航控制器类或应用程序委托。

很抱歉,如果这令人困惑。如果需要澄清,请告诉我,我会尽力而为。否则,希望能让你走上正轨。