如何使用Interface Builder添加导航控制器?

1.步骤:创build一个新的UIViewController:
– Xcode – >新build文件… – >cocoa触摸类 – > UIViewController
– 名称:MyViewController

2.步骤:将“导航控制器”(UINavigationController)从库中拖放到MyViewController.xib中

替代文字

步骤:我确定,我必须做一些事情才能正确连接导航控制器,不是吗?

4.Step:尝试启动新的View Controller作为模式对话框:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; NSLog(@"navContr: %@", myViewController.navigationController); [self.navigationController presentModalViewController: myViewController animated:YES]; 

结果:“navContr:nil”

5.Step:你可以看到新的模式视图(MyViewController),但是没有NavigationController,也没有UINavigationBar。

非常感谢您的帮助!


更新1:

6.Step:我设置了一个新的UIViewController(ViewNavi2)作为“Root View Controller”:
替代文字

7.Step:我在类MyViewController中定义了一个IBOutlet UINavigationController *navigationController ,并configuration了xib:Navigation Controller – > Connections – > Referencing Outlets

但我的导航控制器仍然是零:-(

 MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; NSLog(@"navContr: %@", myViewController.navigationController); // -> "navContr: nil" 

我也想将导航控制器包含在NIB文件中,但苹果文档中所说的全部都是“不是最优的”,而没有真正解释如何去做。 我希望我的主选项卡窗口调用一个包含典型导航控件的模式窗口,而无需以编程方式定义导航控制器。 我会分享我是如何做到的。

你的代码与我的代码非常相似,因为我在MyViewController中定义了一个IBOutlet UINavigationController *navigationController 。 在Interface Builder中,我只是在根视图控制器中定义了我的视图,并将文件的所有者 – >视图设置为该视图定义。

和你的代码类似,我在我的父窗口中执行了以下操作:

 MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self presentModalViewController:myViewController animated:YES]; 

(我打电话presentModelViewController自我,我不知道你为什么有self.navigationController 。)当我testing这个,结果是我的观点是从NIB文件加载,但导航栏丢失。 MyViewController中的另外一行代码解决了这个问题:

 - (void)viewDidLoad { [super viewDidLoad]; [self setView:myNavigationController.view]; } 

我在这里所做的是将MyViewController的视图设置为指向myNavigationController.view,其中包含NIB文件(包括导航控制器)中定义的所有内容。

查看XCode中的模板以获得“基于导航的应用程序”。 (新build项目 – >基于导航的应用程序)然后在Interface Builder中打开MainWindow.xib。 虽然这不是视图,但可以将其视为在步骤1中创build的视图控制器。然后查看在视图中引用的“根视图控制器”,并查看它如何连接到“根视图控制器”属性检查器和“检查器”中的“RootViewController”类。

您需要将您想要在导航根目录中显示的内容放入您的“RootViewController”版本中。 通常,接下来显示的控制器是“DetailViewController”。 再次,通读模板提供的示例代码,您将看到如何开始。 查看RootViewController.m示例模板中didSelectRowAtIndexPath中的注释代码。 您将需要创build自己的视图控制器来充当DetailViewController。

希望这会为你解决问题。

// EDITS基于你的评论//
苹果文档说,如果你想用IB来制作你的导航控制器,你应该把它们放在你的MainWindow.xib中。 我正在修补的事实,你不能有NavigationController作为你的UIView对象的子视图。 你可以做什么从你开始的地方是使用IB添加一个导航栏对象到你的视图控制器,然后从那里控制的东西。

从Apple文档“尽pipe您也可以从主要的nib文件(或任何其他nib文件)加载独立的或模态呈现的导航控制器,但这样做并不是最佳的。在这些情况下,通常以编程方式创build导航控制器使用点“。

// MORE EDITS //在XCode4中,项目模板现在被称为“主细节”项目。 这是因为它将在iPad中设置为分割视图控制器,但仍然是iPhone中的常规导航项目。 在答案中引用“RootViewController”的地方,你会发现一些名为“MasterViewController”

下一个代码是不会给你任何有效的对象。

 NSLog(@"navContr: %@", myViewController.navigationController); 

原因是因为UIViewController的navigationController属性只在视图控制器在堆栈中时才返回导航控制器。 如果找不到导航控制器,则该属性为零。 您的视图控制器不在导航控制器的堆栈中。 无论如何,我甚至不确定是否正确初始化我们的导航控制器。 阅读一些文件。