这就是我所拥有的:
使用一个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属性没有正确设置。问题是,为什么?应该吗?
答案 0 :(得分:1)
在某些情况下,每次将viewDidLoad
添加回viewDidAppear
的堆栈时,可能需要调用awakeFromNib
和UINavigationController
或UIViewControllers
。似乎当典型代码执行AppDelegate
时,窗口或幕后的某些内容正在为UINavigationController
presentModalViewController
做{{1}}做一些特别的事情。
答案 1 :(得分:1)
此外,当你在一个案例中看到类似的事情发生,而不是另一个案例时,创建一个子类并使你的nib指向该子类,或者如果你已经有一个子类使用它,这可能是有益的。
在子类中,覆盖所有各种init:,initWithNibName:bundle:,viewDidLoad:,viewWillAppear:,viewDidAppear:以及任何其他适当的方法,并在那些覆盖中,只是NSLog(“”)关于它是哪种方法的东西(或许使用param值)并调用超级实现。
这将为您提供一个可观察的“跟踪”,其中以哪种方式调用哪些方法,您可以设置断点以查看该调用的来源。
这将为您提供足够的信息来查找丢失的方法调用,然后您可以在这里或通过提交雷达或......来追求正确的问题。
答案 2 :(得分:0)
我想你可能错过了一个概念点。
UINavigationController控制视图控制器而不是视图。它控制视图控制器本身的加载时间和位置。视图本身仅作为其各自控制器的推动和弹出的副作用而被加载。
因此,将导航控制器放在视图控制器内部很少有意义。
如果我理解你正在尝试做什么,你应该将RootController实际设置为UINavigationController的rootController属性(是的命名法非常令人困惑。)然后当你的交换事件发生时,你应该有导航控制器推动下一个观点。 RootController视图将消失以替换为另一个。然后,您可以为任意数量的视图控制器重复此过程。
仅在标签栏的情况下,您希望导航控制器是视图控制器的属性。即便如此,它应该位于选项卡的层次结构的顶部。