我应该如何管理UINavigationController进出另一个UIViewController呢?

时间:2010-02-11 16:13:04

标签: iphone uikit uinavigationcontroller

这就是我所拥有的:

  • 使用一个UIViewController配置的MainWindow.xib文件(子类化为RootViewController)。这个笔尖在应用程序启动时加载。

  • RootViewController有两个ivars,一个UIViewController的自定义子类和一个UINavigationController。这两个都是从笔尖加载的。

当应用程序启动时,两个ivars都从它们各自的nib初始化,然后将UIViewController.view添加为RootViewController.view的子视图。

在UIViewController的视图中,我有一个控件,可以触发UIViewController和UINavigationController的动画交换。这就是问题所在。交换动画,但UINavigationController的视图没有正确显示。我得到一个没有标题的导航栏,没有别的。

UINavigationController nib和底层功能已在独立项目中测试过,但没有RootViewController。

所以,我的问题是,我甚至可以这样做吗?我成功地交换了这样的其他视图控制器,但从来没有UINavigationController。我看到一些文件让我相信这可能是一个愚蠢的差事,但我还没有说服自己。

解决方案(Kinda):

我找到了一个解决方案(解决方法?黑客?),但它会带来更多问题。我使用Nib为UINavigationController添加了nix。相反,我从Nib加载了我的UINavigationController的rootViewController,然后使用initWithRootViewController以编程方式创建了UINavigationController:。

  NavRootViewController *navRoot = [[NavRootViewController alloc] initWithNibName:@"NavRootViewController" bundle:nil];
  navigationController = [[UINavigationController alloc] initWithRootViewController:navRoot];
  [navRoot release];

这正如我所料。这让我得出结论,当我从Nib加载navigationController时,UINavigationController的rootViewController属性没有正确设置。问题是,为什么?应该吗?

3 个答案:

答案 0 :(得分:1)

在某些情况下,每次将viewDidLoad添加回viewDidAppear的堆栈时,可能需要调用awakeFromNibUINavigationControllerUIViewControllers。似乎当典型代码执行AppDelegate时,窗口或幕后的某些内容正在为UINavigationController presentModalViewController做{{1}}做一些特别的事情。

答案 1 :(得分:1)

此外,当你在一个案例中看到类似的事情发生,而不是另一个案例时,创建一个子类并使你的nib指向该子类,或者如果你已经有一个子类使用它,这可能是有益的。

在子类中,覆盖所有各种init:,initWithNibName:bundle:,viewDidLoad:,viewWillAppear:,viewDidAppear:以及任何其他适当的方法,并在那些覆盖中,只是NSLog(“”)关于它是哪种方法的东西(或许使用param值)并调用超级实现。

这将为您提供一个可观察的“跟踪”,其中以哪种方式调用哪些方法,您可以设置断点以查看该调用的来源。

这将为您提供足够的信息来查找丢失的方法调用,然后您可以在这里或通过提交雷达或......来追求正确的问题。

答案 2 :(得分:0)

我想你可能错过了一个概念点。

UINavigationController控制视图控制器而不是视图。它控制视图控制器本身的加载时间和位置。视图本身仅作为其各自控制器的推动和弹出的副作用而被加载。

因此,将导航控制器放在视图控制器内部很少有意义。

如果我理解你正在尝试做什么,你应该将RootController实际设置为UINavigationController的rootController属性(是的命名法非常令人困惑。)然后当你的交换事件发生时,你应该有导航控制器推动下一个观点。 RootController视图将消失以替换为另一个。然后,您可以为任意数量的视图控制器重复此过程。

仅在标签栏的情况下,您希望导航控制器是视图控制器的属性。即便如此,它应该位于选项卡的层次结构的顶部。