2010-08-11 41 views
2

试图围绕如何围绕UINavigationController构建应用程序来包装我的头。在我看来,大多数解释都假设应用总是从根控制器开始,然后从那里开始钻取,但我不清楚这是如何适应登录/注册步骤的情况。该结构是这样的:iPhone UINavigationController应用程序设计

Home page           | Main app (typical nav hierarchy) 
------------           |--------------------------------- 
Log in ----> Login page       | App section 1 
       ------------       | App section 2 
       Do login ------------------------> | etc. 
      <- Cancel        | 
                 | 
Register -------------------> Register page   | 
           -----------------  | 
           Do registration ---> | 
          <- Cancel    | 

所以基本上我假设“主应用程序”控制器实际上应该是应用程序的根控制器,是否正确?在这种情况下,我不清楚如何处理坐在它前面的整个过程(基本上就像是一个与应用程序导航结构分离的导航结构)。 “主页”是在主应用程序上显示的模式控制器,还是用于登录/注册步骤的单独导航控制器,以便在登录后将其弹出来让我们回到应用程序根目录?

希望我只是过分简单的事情,只是还没有点击我。任何指针不胜感激。

编辑:所以这里是我结束了,这似乎为我所需要的。我有两个UINavigationControllers,它们都分配给IB中的MainWindow,并带有独立的起始NIB。一个是应用程序启动导航控制器(主页/登录/注册),另一个是主要的应用程序导航控制器。我的应用程序委托有这样的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [window addSubview:startNavController.view]; 
    [window makeKeyAndVisible]; 
    return YES; 
} 

- (void)activateMainApp { 
    [startNavController.view removeFromSuperview]; 
    [window addSubview:appNavController.view]; 
    [window makeKeyAndVisible]; 
} 

登陆/注册的最后一步,我有这样的代码是什么叫应用程序的委托,使导航控制器之间的切换:

- (IBAction)continuePressed { 
    // Transfer control to the main app nav controller: 
    MyAppDelegate *app = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
    [app activateMainApp]; 
    [app release]; 
} 

我怀疑我可以用一个导航控制器完成这个任务,但是这对我来说基于我的视图结构是合乎逻辑的,并且似乎可行,并且我最终将主视图作为应用导航控制器的根视图。任何额外的反馈意见,如果有什么骨头的话,赞赏。

+0

你不应该在你的视图控制器中调用'[app release]',因为你没有保留它。 – jowie 2012-10-19 14:05:06

+0

@bmosekau:为什么使用:'[window addSubview:startNavController.view];'而不是'self.window.rootViewController = startNavController'等等。 – 2013-08-06 06:38:16

+0

@ user2568508邓诺。我不得不跳进我的时间机器,并拨回3年来回答这个问题。 – 2013-08-08 05:57:41

回答

3

您可以在任何阶段创建一个UINavigationController,包括在您的登录屏幕之后 - 将其作为您想要开始使用它的视图的子视图。您将在该点看到视图控制器(您制作新导航控制器的根视图)。一旦拥有它,你可以将新的视图控制器推到导航堆栈上。您可以看看导航堆栈

根控制器除了可以在一个调用(popToRootViewControllerAnimated)中获得,并且您不能进一步弹出。所有由导航控制器管理的视图控制器都位于堆栈上,因此您可以按压堆栈或弹出堆栈。

我认为这是一个有用的东西,当后退箭头有用时。

+0

那么你是说登录/注册步骤实际上不是由导航控制器管理的吗?应用程序委托或标准视图控制器将手动管理该部分? – 2010-08-11 06:48:40

+0

当然你可以做任何方法。一种方法可能是在屏幕的可见部分创建登录视图,然后在另一个视图中从屏幕外位置创建动画,以便在登录验证后覆盖登录屏幕。在您的导航控制器中加入动画的视图。如果有人点击注销按钮,您可以再次将其滑出,请清除导航堆栈并重新开始。 (这好像是我同意的动画控制器 - 但它在登录屏幕上方设置了根视图,并且您可能会使用一些动画过渡来区分它与普通的应用内导航。) – 2010-08-11 06:56:27

+0

也许这有助于 - 您看到视图。视图位于视图控制器中,导航控制器移动视图控制器。视图控制器可以做很多没有,它们是一个方便的对象,将一个滑过另一个,然后再回来。 您的视图可以位于可见区域或屏幕外 - 直到需要时才将更大类型的控件(如UIDatePicker)放置在屏幕外区域,这一点相当常见,就像系统使用键盘一样。当你需要它时,将它带回到屏幕的可见部分。您也可以使用导航控制器视图来启动基于堆栈的导航。 – 2010-08-11 07:05:49

0

UINavigationController实际上只是一种组织UIViewControllers的方法。不必具有特定的根视图。你只要把你想要的观点放在最前面。

要在顶部添加另一个视图控制器只需调用[UINavigationController pushViewController:animated:YES];