0

我想更好地了解 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 文件中,我可以设置标题和设置按钮,但这不起作用。

这仅在我在实际视图控制器本身中设置 self.navigtionController 项目时才有效。这是正确的,还是我应该在 UINavigationController 中做些什么来让它工作。

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

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

4

2 回答 2

3

如果您查看UINavigationController 类参考,它会说(重点由我添加,但您应该阅读所有内容,以便了解它是如何工作的):

更新导航栏
当用户更改顶级视图控制器时,无论是通过推送或弹出视图控制器还是直接更改导航堆栈的内容,导航控制器都会相应地更新导航栏。具体来说,导航控制器会更新显示在三个导航栏位置中的栏按钮项:左、中和右。条形按钮项是 UIBarButtonItem 类的实例。您可以根据需要创建具有自定义内容的项目或创建标准系统项目。有关如何创建条形按钮项的更多信息,请参阅 UIBarButtonItem 类参考。

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

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

导航控制器更新导航栏中间如下:

  • 如果新的顶级视图控制器具有自定义标题视图,导航栏将显示该视图以代替默认标题视图。要指定自定义标题视图,请设置视图控制器导航项的 titleView 属性。
  • 如果没有设置自定义标题视图,导航栏会显示一个包含视图控制器默认标题的标签。这个标签的字符串通常是从视图控制器本身的标题属性中获得的。如果要显示与视图控制器关联的标题不同的标题,请改为设置视图控制器导航项的标题属性。

导航控制器更新导航栏右侧如下:

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

每次顶视图控制器更改时,导航控制器都会更新导航栏。因此,每次将视图控制器推入堆栈或从中弹出时,都会发生这些更改。当您为 push 或 pop 操作设置动画时,导航控制器类似地为导航栏内容的更改设置动画。

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

您还应该替换根视图控制器,而不是将视图控制器推送到导航堆栈上,这样您就不会一直将视图控制器添加到堆栈中。这也避免了显示后退按钮,并且您不需要明确摆脱它。您可以使用以下setViewControllers:animated:方法来执行此操作:

[self.navigationController setViewControllers:[NSArray arrayWithObject:theNewViewController] animated:YES];
于 2012-11-03T04:08:52.933 回答
0

只有一个 NavigationController,这个 NavigationController 控制着所有的 ViewController。所以 barButtonItems 和 title 是在每个 ViewController 中设置的,你不应该直接将它们设置为 NavigationController。

如果你想推送一个新的 ViewController 而不会推回,我认为这可能会导致一些问题,因为 NavigationController 正在使用 Stack 来处理所有的 ViewController。似乎您会将 ViewController 推入堆栈但不会弹出它,也许您会得到一些您不想要的行为。

如果您仍然想实现这一点,我认为您无法避免在不同的 ViewController 中进行类似的设置。

于 2012-11-03T03:06:03.380 回答