Iphone 我应该如何管理在另一个UIViewController中交换UINavigationController?

Iphone 我应该如何管理在另一个UIViewController中交换UINavigationController?,iphone,uikit,uinavigationcontroller,Iphone,Uikit,Uinavigationcontroller,以下是我所拥有的: 配置了一个UIViewController(子类为RootViewController)的MainWindow.xib文件。此nib在应用程序启动时加载 RootViewController有两个IVAR,一个UIViewController的自定义子类和一个UINavigationController。这两个都是从NIB加载的 当应用程序启动时,两个IVAR都从各自的NIB初始化,然后UIViewController.view被添加为RootViewController

以下是我所拥有的:

  • 配置了一个UIViewController(子类为RootViewController)的MainWindow.xib文件。此nib在应用程序启动时加载

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

当应用程序启动时,两个IVAR都从各自的NIB初始化,然后UIViewController.view被添加为RootViewController.view的子视图

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

UINavigationController nib和底层功能已经在一个独立的项目中进行了测试,但是没有RootViewController

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

解决方案(类似):

我找到了一个解决方案(变通方法?黑客?),但它引出了更多的问题。我禁止使用UINavigationController的Nib。相反,我从Nib加载了UINavigationController的rootViewController,然后使用initWithRootViewController以编程方式创建了UINavigationController:

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

这正是我所期望的。这使我得出结论,当我从Nib加载navigationController时,UINavigationController的rootViewController属性设置不正确。问题是,为什么?是吗?

我想你可能错过了一个概念上的要点

UINavigationController控制视图控制器而不是视图。它控制何时何地加载视图控制器本身。视图本身仅作为推压和弹出其各自控制器的副作用加载

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

如果我理解您试图正确执行的操作,您应该将RootController实际设置为UINavigationController的RootController属性(是的,术语非常混乱)。然后,当发生交换事件时,您应该让导航控制器推送下一个视图。RootController视图将消失,并被另一个视图替换。然后,可以对任意数量的视图控制器重复该过程


只有在选项卡栏的情况下,您才会希望导航控制器成为视图控制器的属性。即使这样,它也应该位于选项卡层次结构的顶部

在某些情况下,每次将
UINavigationController
添加回
UIViewControllers
的堆栈时,可能需要调用
viewDidLoad
viewdidisease
awakeFromNib
。当典型的代码在您的
AppDelegate
之外执行时,窗口或幕后的某些东西似乎在为
UINavigationController
做一些特殊的事情,而
presentModalViewController
没有做这些事情。

同样,当您看到类似的事情发生在一种情况下,而不是另一种情况下,创建一个子类并使您的nib指向该子类,或者如果您已经有了一个子类,则使用该子类是有益的

在该子类中,重写所有不同的init:、initWithNibName:bundle:、viewDidLoad:、viewWillAspect:、viewDidAspect:和任何其他适当的方法,在这些重写中,只需NSLog(“”)它是什么方法(可能带有参数值)并调用超级实现

这将为您提供一个可观察的“跟踪”,跟踪哪些方法是按哪个顺序调用的,您可以设置一个断点来查看调用来自何处


这将为您提供足够的信息来查找丢失的方法调用,然后您可以在此处,或通过归档雷达或…

查找正确的问题您正在描述的行为(带有导航栏的空白视图,没有标题)听起来好像您的导航控制器没有根控制器。但如果不检查你的整个项目,这只是一个黑暗中的镜头。你能上传一个暴露问题的测试项目吗?NavigationController的rootViewController应该从Nib加载。当我使用NavigationController作为顶部视图控制器时,它就可以工作了。我会看看我是否能把一些东西放在一起发布。是的,你应该能够加载一个nav控制器,它的根控制器是从一个NIB文件设置的。尝试在Xcode中创建一个空白的基于导航的项目,并将其MainWindow.xib的设置精确复制到NavController.xib。导航控制器的根控制器必须在此NIB文件中实例化(作为导航控制器的子项),其NIB file属性必须包含其NIB文件的名称。是的,我让它使用一个空白的基于导航的项目。我就是这样开始的。然后我转到了我上面描述的模式,那就是事情出错的时候。谢谢你的回答。让UINavigationController成为俯视图控制器是我的计划B。我真的很想了解为什么这不起作用。我现在有它的工作,并将张贴额外的信息在我的问题,因为我仍然不明白一些事情。我认为,一旦我确定我能处理一些事情,B计划实际上会变成A计划。你肯定希望你的设计与API一起流动,而不是与之抗争。我知道,那样会让人心痛。不过你没抓住重点。有时,您不希望UINavigationController成为您的根。在我正在做的项目中