我可以只在第二级加载UINavigationController,而不是在Root View Controller加载

时间:2011-09-06 22:04:09

标签: iphone ios uiviewcontroller uinavigationcontroller

我尝试寻找类似的问题,但我找不到类似的问题。

我在UIView中加载UINavigationController,而不是(如大多数示例中)MainWindow。

我创建了一个名为DocumentsViewController的新.xib,它是UIView的子类(它有相关的.m和.h文件)。我创建了一个DocumentsRootViewController.xib,它是UITableViewController的子类,它应该是UINavigationController的RootViewController。

我移动到DocumentsViewController并在Interface Builder中添加了一个UINavigationController对象。然后我去了代码,并在IBOutlet中添加它,并将其连接到对象。

在ViewDidLoad中,我执行以下行:

DocumentsRootViewController *rootViewController = [[[DocumentsRootViewController alloc] init] autorelease];
rootViewController.title = @"Documents";
[navigationControllerDocuments initWithRootViewController:rootViewController];
[self.view addSubview:navigationControllerDocuments.view];    

它按预期显示表格,但它显示“Root View Controller”的“Back”按钮(如下图所示)。

为什么呢?难道它不应该知道rootviewcontroller已经设置好了吗?

提前感谢那些澄清这个疑问的人

乔瓦尼

The UINavigationController behavior Xib Structure

1 个答案:

答案 0 :(得分:1)

当您通过Nib添加UINavigationController时,它实际上在nib文件中创建了一个UINavigationController实例,其中包含一个默认的RootViewController集(类型为UIViewController),默认标题为RootViewController。

当您加载nib时,此对象是作为加载nib的一部分创建的(即初始化DocumentsViewController时) - 因此navigationControllerDocuments出口已经初始化为UINavigationController,并且已经在其上设置了默认的ViewController。

我认为当你调用'initWithRootViewController'时 - 你在一个已经初始化的对象上调用它 - 所以它再次运行初始化代码 - 将第二个视图控制器(DocumentRootViewController)推入堆栈,但是在笔尖中创建的默认值已经存在。

你应该做的就是忘记在笔尖中创建一个并以编程方式初始化整个事物。

即。你在哪里:

[navigationControllerDocuments initWithRootViewController:rootViewController];

我建议你改为使用alloc和init:

[[navigationControllerDocuments alloc] initWithRootViewController:rootViewController];

由于你这样做,你真的不需要将导航控制器添加到笔尖中,所以如果这样做,你应该从笔尖中删除它,因为你在代码中用这个替换它。