使用UINavigationController视图

我想更好地理解使用UINavigationController的。

我已经使用UINavigationViewController以及其他两个视图控制器设置了一个新项目。

在我的应用程序委托中,我有以下几点:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; firstViewController = [[NCTFirstViewController alloc] initWithNibName:@"NCTFirstViewController" bundle:nil]; navController = [[NCTNavViewController alloc] initWithRootViewController:firstViewController]; self.window.rootViewController = self.navController; [self.window makeKeyAndVisible]; 

在我的UINavigationController.m文件中,我可以设置标题并设置button,但这不起作用。

这只适用于如果我在实际的视图控制器本身设置self.navigtionController项目。 这是正确的,或者有什么我应该在UINavigationController做这个工作。

理想情况下,我正在寻找一个UINavigationController处理所有推送到其他控制器。 从长远来看,它将被用作菜单系统。 所以如果用户点击顶部的一个button,它们被推送到一个新的视图控制器,但没有后退选项,只是在顶部的导航栏中显示一个新的中央视图控制器相同的菜单项。

我遇到的问题是了解如何设置。 如果我必须在视图控制器本身设置它,他们都不会重复相同的代码。 当然,我可以在AppDelegate中设置所有的“移动”,但是这看起来不正确,并且会收起App Delegate本身。

如果你看UINavigationController类的引用 ,它说(强调加我,但你应该阅读所有,以便你了解这是如何工作的):

更新导航栏
当用户改变顶层视图控制器时,无论是通过推或者popup视图控制器还是直接改变导航堆栈的内容,导航控制器都相应地更新导航栏。 具体地,导航控制器更新在三个导航栏位置中的每一个中显示的栏button项目:左,中,右。 酒吧button项目是UIBarButtonItem类的实例。 您可以使用自定义内容创build项目,也可以根据需要创build标准系统项目。 有关如何创build栏button项目的更多信息,请参阅UIBarButtonItem类参考。

导航栏左侧的栏button项允许导航回导航堆栈中的前一个视图控制器。 导航控制器按如下方式更新导航栏的左侧:

  • 如果新的顶层视图控制器具有自定义的左栏button项目,则显示该项目。 要指定自定义左栏button项目,请设置视图控制器导航项目的leftBarButtonItem属性。
  • 如果顶级视图控制器没有自定义的左栏button项目,但前一个视图控制器的导航项目在其backBarButtonItem属性中具有有效项目,则导航栏会显示该项目。
  • 如果一个视图控制器没有指定一个自定义栏button项目,则使用一个默认的后退button,其标题被设置为前一个视图控制器的title属性的值,即视图控制器向下一级堆栈。 (如果导航堆栈中只有一个视图控制器,则不显示后退button。)

导航控制器更新导航栏的中间位置,如下所示:

  • 如果新的顶层视图控制器具有自定义标题视图,则导航栏将显示该视图来代替默认标题视图。 要指定自定义标题视图,请设置视图控制器的导航项目的titleView属性。
  • 如果未设置自定义标题视图, 则导航栏将显示包含视图控制器默认标题的标签。 这个标签的string通常是从视图控制器本身的title属性获得的。 如果要显示与视图控制器关联的标题不同的标题,请改为设置视图控制器的导航项目的标题属性。

导航控制器更新导航栏的右侧,如下所示:

  • 如果新的顶层视图控制器有一个自定义的右栏button项目,则显示该项目。 要指定一个自定义的右栏button项目,请设置视图控制器的导航项目的rightBarButtonItem属性。
  • 如果未指定自定义右侧栏button项目,则导航栏右侧不显示任何内容。

每当顶视图控制器更改时,导航控制器都会更新导航栏。 因此,每次将视图控制器压入堆栈或从中popup时,都会发生这些更改。 当您执行推动或popup操作的animation时,导航控制器同样会对导航栏内容的变化进行animation处理。

所以,要做你想做的事情,你需要在每个视图控制器中设置标题和button。 设置标题的最简单方法是在storyboard / xib中设置它,或者在创build时在代码中设置它。

您还应该replace根视图控制器,而不是将视图控制器推到导航堆栈上,以便不要将视图控制器添加到堆栈。 这也避免了显示后退button,你不需要明确地摆脱它。 你可以通过使用setViewControllers:animated:方法来做到这一点:

 [self.navigationController setViewControllers:[NSArray arrayWithObject:theNewViewController] animated:YES]; 

只有一个NavigationController,这个NavigationController控制着所有的ViewController。 因此,在每个ViewController中设置barButtonItems和titles,您不应将它们直接设置为NavigationController。

如果你想推新的ViewController,并不会推回去,我认为这可能会导致一些问题,因为NavigationController是使用堆栈来处理所有的ViewControllers。 似乎你会推栈中的ViewController,但不popup它,也许你会得到一些你不想要的行为。

如果你仍然想实现这一点,我认为你不能避免在不同的ViewControllers做类似的设置。